Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Getdevicecaps

Iniciado por O2, 31 de Julio de 2004, 06:58:02 PM

« anterior - próximo »

O2

 Buenas:

Uso GetDeviceCaps para recopilar información del dispositivo Direct3D y tengo un problema a la hora de mostrar esta información por pantalla, me aparecen valores que no tienen sentido:

Número máximo de luces simultaneas: -1
Versión de vertex shader: -130304
Versión de pixel shader: -65024

Todo ello usando %d como formato. (Con el resto de caps no parece dar problemas)

He leido que las versíones de shaders están enmascaradas dentro del DWORD de forma que el HIWORD es la versión, y el LOWORD la sub-versión, o algo así.

El caso es que probando a imprimirlos con HIWORD() y LOWORD() obtengo tambien resultados sin sentido como: 65534 o 768.

Alguien que lo haya hecho (Haddd creo) podría aclararme esta duda?

Por otro lado, pensé que el Vendor, Renderer y Version, estarían en la estructura D3DCAPS9, pero parece que no. Como puedo obtener el nombre de la tarjeta, sistema operativo, y demás hardware?

Muchisimas gracias de antemano.

_Grey

 La version de VERTEXSHADERS:

D3DSHADER_VERSION_MAJOR(caps.VertexShaderVersion)
D3DSHADER_VERSION_MINOR(caps.VertexShaderVersion)

Si la quieres en una cadena de texto, puedes hacer lo siguiente:

sprintf(str,"VS:%d.%d",
D3DSHADER_VERSION_MAJOR(caps.VertexShaderVersion),
D3DSHADER_VERSION_MINOR(caps.VertexShaderVersion));

Siendo str, un array de char.


La version de PIXELSHADERS

D3DSHADER_VERSION_MAJOR(caps.PixelShaderVersion)
D3DSHADER_VERSION_MINOR(caps.PixelShaderVersion)

Si la quieres en una cadena de texto, puedes hacer lo siguiente:

sprintf(str,"PS:%d.%d",
D3DSHADER_VERSION_MAJOR(caps.PixelShaderVersion),
D3DSHADER_VERSION_MINOR(caps.PixelShaderVersion));

Siendo str, un array de char, como el anterior.

Para las luces, siguiendo el ejemplo anterior usa lo siguiente:
sprintf(str,"MaxActiveLights :%d",caps.MaxActiveLights);

Respecto al resto, no sabria decirte.... pero en la documentacion de los DX, he visto que quiza te sirva el metodo GetAdapterIdentifier del objeto IDirect3D8.

Es esto? Saludos.

O2

 _Grey, muchas gracias por tu ayuda, no sabia de la existencia de esos D3DSHADER_VERSION...

El caso es que me dice que "Pixel shader versión 3.0" y tengo una Ati 9500... ¿No deberia ser 2.0?

Por cierto, para las luces lo hago tal y como dices, y obtengo -1 luces :(

Voy a probar de inmediato GetAdapterIdentifier. Te mantendré informado.

Un saludo y gracias de nuevo!!

Haddd

 Te dice que soportas shaders 3.0, porque seguramente analizas el device REF, que es por software. Normalmente, en la rutina de inicialización se comprueban ambos devices. Pero en realidad el que te interesa es el HAL.

_Grey

 Los errores que nombras podrian ser causados por los motivos expuestos por Haddd.

Cuando uses GetDeviceCaps(), en el SEGUNDO parametro ponle D3DDEVTYPE_HAL, y sabras las capacidades de que dispones usando la aceleracion por hardware. Por cierto, usando D3DDEVTYPE_REF tambien me sale -1 en las luces maximas, asi que seguramente sea eso, e indique que no tiene limite o algo por el estilo.

Cuando uses CreateDevice(), recuerda poner en el SEGUNDO parametro lo mismo que en GetDeviceCaps(). Como te puedes imaginar podria ser todo un problema tener las caracteristicas de un modo y usar el otro.

Espero que te ayude, chao!.

O2

 Hmm, teneis razón, puedo estár analizando  el dispositivo REF, pero GetDeviceCaps no tiene segundo parametro... (Al menos en DX9)

Como lo haces tú, Haddd?

Gracias a ambos!

Saludos.

_Grey

 Si que tiene. lo que pasa es que tienes que usar el GetDeviceCaps() del objeto IDirect3D9, y tu usas el del objeto IDirect3DDevice9.

Es decir que uses el GetDeviceCaps(), del objeto que retorna la funcion Direct3DCreate8() (o Direct3DCreate9() con directx9).

Suerte!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.