vereis, tengo un cargador / renderizador de modelos que me tira de perlas. pero todas las pruebas, y los paraemtros de config los tengo fijos, los he hecho en mi pc, y al intentar ejecutarlo en otro ordenador, al cual solo tengo acceso 1 ora a la semana, asi ke no puedo hacer tests ahi, al ejecutar, me kedao flipao de que salian colores amarillos y fucsias parpadeantes a toda ostia, no se xq. alguien ke sepa a ke se debe?
p.d: aora mismo voi a acer una app en c++ builder pa configurarlo to antes dejecutar, no me exeis la bronca xDDD
Jur jur, pueden ser muuchas cosas, me da a mí ;).
Y pon al menos un archivo de configuración, un simple .txt de donde puedas parsear los settings para hacer pruebas :P.
Supongo que compruebas todos los HRESULTS de retorno de DX, el modo que seleccionas lo soporta la tarjeta?
Limpias el BackBuffer?
Tengo un poco olvidado D3d... :( , danos más datos ;)
Juas juas juas!! Creia ke yo era el único a kien le pasaba!! Me pasa exactamente lo ke describes.
En mi ordenador y en otros no pasa eso, va bien. Pero al intentar ejecutar el enigne en un ordenador de la Universidad (sospecho con unos drivers bastante maltrechos v.v) pues me pasa eso. Lo peor es ke ese ordenador tiene la misma tarjeta grafica ke yo (una GeForce2 GTS/PRO) y en mi casa no me pasa.
Yo atribuyo esto a lo mal instalados ke estan los drivers de la tarjeta o el propio directx en ese ordenador (no es el unico ke tiene mal instalados los drivers en ese laboratorio) que ademas corre sobre un windows 2000, ke por lo ke he oido no le mola muxo direct3d. Puede ke sea eso lo mismo ek te pasa a ti, puesto ke al probar lo en un ordenador de libre acceso de la universidad, seguramente no tendra bien instalados los drivers o los directx.
A mi tb me pasa con uno de mis programas :(
A mi me pasaba con un programa en el que yo creaba el vertex buffer y me encargaba de dibujarlo. Pero ese programa tb es capaz de cargar archivos X y dibujarlos con el interfaz ID3DXMesh, y entonces funciona correctamente... asi que (en mi caso) no parece ser tema de drivers...
Prueba a cambiar los parametros de creacion del vertex buffer, asegurate de que el vertex buffer se rellena con los datos que le indicas...
Si averiguas algo avisa ;)
no utilizo todavia vertex buffers, utilizo DrawPrimitiveUP
Estoy empezando a odiar los vertex buffers, index buffers y toa la ostia... sabeis si directx 9 va a continuar cone eso? o ser va a adoptar algo mas parecido a los arrays de opengl?
:-MMMM habia olvidado que tb me pasaba con drawprimitiveUP.... :(
no se q podra ser... :(
juas!
Vertex & Index buffers rules!!!
Lo siento, pero Direct3D 9 los seguirá teniendo.
Saludos.
Claro que DX9 sigue con los VB,IB y demás... son parte indispensable del TN&L.... y mucho mejor así.
No sé donde os falla, intentad hacer una traza de todas los códigos que devuelve dx , de lo que pedís y de lo que soporta la tarjeta.( Y mirad la versión de los drivers ;) ).
Indispensable porke? OpenGL tambien usa TnL u no usa vertex buffers. Ademas, me parece mas potente la forma en ke se especifican los arrays en opengl, un array separado para los vertices, otro para las coordenadas de textura, otro para las normales, y no todo junto en una estructura.
lo de los corlores fucsia amarillo etcetera puede deberse a varias cosas...
lo mas frecuente es que o bien no has podido hacer un lock al vertex/index buffer o bien estas intentando pintar vertices con un FVF distinto al que el vertex buffer tiene especificado.
por ejemplo creas el VB con un FVF VERTEX | NORMAL | TEXTURE y los estas llenando y pintando con un VERTEX | NORMAL ...
es decir, el tamano del vertice no es el mismo.
en el panel de control tienes un icono de directx, en la seccion de debug puedes ponerlo a medio/alto. cuando te aparezcan estos colores fucsia y amarillo mira en el output del visual studio porque direct3d te estara dando informacion de lo que pasa...
si en un ordenador te funciona y en otro no, esta claro que una de las tarjetas no tiene una de las caracteristicas que estas intentando usar, por ello no puede crear el Vertex Buffer perfectamente, y al pintar no encaja nada...
salu2
En mi caso, los 2 ordenadores donde lo he probado tienen la misma tarjeta (una GeForce2), por eso decia ke en mi caso kreo ke se debe a ke estan mal instalados los drivers de la tarjeta o los directx, porke si no deberia ir bien bajo el mismo hardware.
pero es que ni uso vertex buffers.. lo hago con DrawPrimitiveUP. Luego, lo del debug, en el pc ke me va mal no puedo hacerlo xq no tengo ninguna herramienta de desarrollo instalada. Lo de FVF, tengo 1 solo asi que ese uso en todos lados XD hm, los dos tienen aceleradora (no creo que para renderizar un modelo se necesite mas XD) y.. nose : güat japens?:(
entonces siempre que hagas cualquier operacion con el vertex buffer (create, lock) y al hacer el drawprimituveup especialmente, utiliza el tipico...
if (FAILED(pD3DDevice->DrawPrimitiveUp () ))
//ha habido un error, muestralo!
else
//todo bien
segun el codigo de error que devuelve puedes saber que es lo que pasa, el mismo codigo de error tiene asociada una string que lo describe y es la que se muestra al hacer debug, lo puedes hacer a mano con un messagebox o algo parecido.
ya tengo el failed ese, y me da error, pero como sé el tipo de error que da?
CoLSoN2, que llamada te falla ? cual te devuelve failed ?
Colson, en vez de usar el failed asi, usalo de la siguiente manera:
HRESULT hres;
hres=FuncionDeDirectX(bla,bla);
if (FAILED(hres))
{
// ahora segun el valor de hres podremos saber el error exactamente
if (hres==D3DERR_NOTENOUGHMEMORY)
MessageBox("no hay memoria suficiente");
// etc...
}
lord trancos en el DrawPrimitiveUP
ok, lo haré así
Ejem...
Busca esta función:
Returns a string that describes a Microsoft® DirectX® HRESULT value.
TCHAR *DXGetErrorDescription9(HRESULT hr);
(Weno, la de las DX8 que supongo que usas ;) ). Y entérate de qué coño te falla. Estaba en la librería Dxerr9.lib. ).
PD: Hay varias funciones y macros utilitarios en la librería de debug esa, echales un ojo.
Suerte...
Y no olvides despues decirnos como lo solucionaste ;)
Error al crear el device, hago DXGetErrorDescription, y me dice:
"Call successful, but returned FALSE"
a ke mola? XD
:o Prefiero que una funcion me devuelva un numero que no entiendo a que me devuelva algo como eso xDDD
:o :o :o :o
Uhmm, cuando puede ser creado con éxito y devolver FALSE?.
El error era en DrawPrimitiveUP(), no?. Compruebas que el device no está Lost?(Me encanta el Spanglish :D ).
Las llamadas a crear el device sí son correctas, verdad?.
Lo mejor sería que pegaras el código.... alguna chorrada estará pasando :jaja:
no , e echo algunos cambios en el codigo, y el error ese raro lo ace al intentar crear el device :P
el codigo de la funcion, hasta el momento en el que el Device no se crea bien, es:
void W3C_GFX_Graphics::Init(HWND hWnd, bool fullscreen, int fwidth, int fheight, byte fcolordepth, FILTERINGTYPE filtering)
{
m_hWnd = hWnd;
Log("INITIATING GFX ENGINE...");
m_fullscreen = fullscreen;
D3DDISPLAYMODE d3ddm;
if (fullscreen == true)
{
d3ddm.Width = fwidth;
d3ddm.Height = fheight;
d3ddm.RefreshRate = 0; // por defecto
switch (fcolordepth)
{
case 16:
d3ddm.Format = D3DFMT_R5G6B5;
break;
case 32:
d3ddm.Format = D3DFMT_X8R8G8B8;
break;
}
}
else
{
if (m_error = FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
Error("ERROR! No se ha podido obtener el modo de mostrado");
CheckErrors(m_error);
}
else
Log("Display's Mode got");
}
if (m_error = FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, d3ddm.Format, d3ddm.Format,
!m_fullscreen)))
{
Error("ERROR! Modo de color no soportado por el dispositivo");
CheckErrors(m_error);
}
else
Log("Device Type Checked");
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
if (fullscreen == false)
{
d3dpp.Windowed = true;
Log("Running on Windowed mode");
}
else
{
d3dpp.Windowed = false;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
Log("Running on Fullscreen mode");
}
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.BackBufferFormat = d3ddm.Format; // mismo color
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.BackBufferCount = 1;
d3dpp.hDeviceWindow = m_hWnd;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = true;
// obtenemos el device
if (m_error = FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &m_pDevice)))
{
Error("ERROR! Creación del Device fallida");
CheckErrors(m_error);
}
else
Log("Device Created");
Fullscreen es true, width = 800, height = 600, colordepth = 16. alguien sabe xq no se crea bien? la comprovacion del modo de color dice que no hay error..
IASTA SOLUSIONAOooOoooOoa!!!
ke como ?
- no era nada de codigo, era que (como pensaba desarrollar, o al menos compilar algo algun dia, ya que eran los PCs del cole) instalé la DX SDK 8.1, y compilaba de coña, pero pasaba esto. Tonces, hoy, tras salir frustrado el dia anterior, iba yo con mi super programa en c++ builder configuralo-todo, para ir probando xq petaba, llego, (lo primero es kel programa este no tiraba xq necesitaba una DLL del builder xD) y sigue sin funcionar, en los dos PCs donde habia instalado el SDK. Le explico que otra gente (vusotru xD) tambien le pasa lo mismo, y me dice que probemos en otros PCs del aula. Le digo ke en vez del SDK, ke tarda mucho, instalar solo el DX "light", el ke viene en todos los juegos vaya. Lo instalamos, y WOP! tiraAaAA!1 ke tiraaAaa!! bwahahaaha!! ok, instalamos esto, incluso en los de la SDK, y ya funciona: me r00lz XD
p.d:me gustaria ke lo probarais y me dijerais si esto os pasaba a vosotros tambien
p.d.d:thx a todos por ayudar =)
p.d.d.d: PUTA MICROSOFT -_-!
Holas, me temo qu no podre probarlo porque en el ordenador donde me va mal tiene un win2000 y no tengo permisos para instalar el DirectX runtime (supongo ke es este al ke te referias)
uno de los ke pasaba esto era un win2000, lo e instalado, y c000000l xD
Gracias Colson ;)
as probado si era ese tu problema?
Pues nop, pq no tengo acceso a los ordenadores donde tengo entendido que mi programa fallaba; el de Haddd (aka Dracula) y el de Frodig.