Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: davidgf en 26 de Agosto de 2007, 02:08:05 PM

Título: La luz ambiental
Publicado por: davidgf en 26 de Agosto de 2007, 02:08:05 PM
Hola!

Pues bien, aunque soy nuevo en este foro, hace años que os sigo y ahora por primera vez me he queado "pillao" y busco vuestra ayuda ;).

Mi problema es: dibujo una mesh con XYZ + TEX1 (DirectX)
He leído que si no especifico normales nada de lighting. Pero sí de ambient.
Y modificio el ambient y no hay manera que se vea afectado.

He encotrado un ejemplo donde veo que funciona perfectamente, pero en mi proyecto no (claro que es un juego y tiene miles de cambios de State)

Qualquier ayuda es valiosa!

Gracias!

David
Título: La luz ambiental
Publicado por: XÑA en 27 de Agosto de 2007, 12:14:06 PM
Bueno, no tiene sentido especificar ambient lighting sólo. La razón es que la luz ambiente es UNA PARTE de la fórmula de iluminación. Me temo que tendrás que añadir las normales al modelo y activar luces.
Título: La luz ambiental
Publicado por: davidgf en 27 de Agosto de 2007, 12:21:32 PM
ya lo sé lo que pasa es que yo uso lightmaps i para regular el brillo de cada objeto en el mapa uso el ambient sabes?

pero por lo que parece no funciona y he visto ejemplos donde sin normales el ambient funciona a la perfeccion
Título: La luz ambiental
Publicado por: XÑA en 27 de Agosto de 2007, 03:28:14 PM
Cierto, he encontado esto en la documentación de DirectX. Yo creía que siempre se aplicaba toda la formulación de la luz, pero no!!


In this example, the object is colored using the scene ambient light and a material ambient color.

#define GRAY_COLOR 0x00bfbfbf

// create material
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.Ambient.r = 0.75f;
mtrl.Ambient.g = 0.0f;
mtrl.Ambient.b = 0.0f;
mtrl.Ambient.a = 0.0f;
m_pd3dDevice->SetMaterial(&mtrl);
m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, GRAY_COLOR);

According to the equation, the resulting color for the object vertices is a combination of the material color and the light color.

Sin embargo, utilizando lightmaps, no sé exactamente como se tratará.
Título: La luz ambiental
Publicado por: davidgf en 27 de Agosto de 2007, 03:49:14 PM
mm no me he explicado bien. El modelo en el que aplico ambient lighting no usa lightmaps. Es simplemente un XYZ + TEX1. Sencillo pero no funciona

I vaia casualidad he encontrado lo mismo que tu en la documentacion y he hecho mil pruebas pero no funciona! Me caguen. Probare con las normales pero diria que no servirá de nada. Además es un palo porque uso DLLs i tendre que recompliar mil y una cosas. Bueno lo pruebo y comento

El proyecto: http://tarraco.davidgf.net
Título: La luz ambiental
Publicado por: XÑA en 27 de Agosto de 2007, 04:20:22 PM
¿tienes activado el renderState de Lighting ?

Y quizás necesite tener una luz, aunque luego no la utilice.
Título: La luz ambiental
Publicado por: davidgf en 27 de Agosto de 2007, 04:26:54 PM
Pues si. De hecho los objetos en la misma escena que son Meshes se ben bien con diferentes luces/ambients. En cambio los montones de triangulos en forma DrawPrimitive no se ven bien.

Muchas gracias por la ayuda, yo lo sigo intentando.. si se os ocurre algo ;)

David
Título: La luz ambiental
Publicado por: Pogacha en 27 de Agosto de 2007, 05:58:47 PM
No estoy seguro de como estas haciendo los lightmaps y todo eso, pero si estas modificando los estados de la pipeline, para eso tienes que agregar una stage de modulación por el D3DRENDERSTATE_TEXTUREFACTOR.
Así es como yo hago texture flat shading + lightmapping.

lpD3DDev->SetRenderState( D3DRENDERSTATE_TEXTUREFACTOR, ColorParaModular);

lpD3DDev->SetTexture(0, lptexLightMap);
lpD3DDev->SetTexture(1, lptexTexture);

lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);

lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);

lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_TFACTOR);

lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_MODULATE);

lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_CURRENT);

lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG2, D3DTA_TEXTURE );



En una de esas no te entendí y no era esto lo que buscas ... DX no es mi fuerte.
Título: La luz ambiental
Publicado por: davidgf en 28 de Agosto de 2007, 12:12:04 AM
Yo uso estos states:

Device.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
Device.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
Device.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
Device.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
Device.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE


Me podrías explicar donde guarda y como se calcula la ilumiacion?? Es que nunca lo he entendido del todo. Si no especifico color en el material ni el el vertice, de dónde lo saca el DX?

Edit: tus states van igual que los míos, de hecho más lentos pero la iluminación sigue sin funcionar
Título: La luz ambiental
Publicado por: Zaelsius en 28 de Agosto de 2007, 12:28:56 AM
Aquí tienes la docu y un ejemplo:

http://doc.51windows.net/Directx9_SDK/?url=/Directx9_SDK/graphics/programmingguide/fixedfunction/lightsandmaterials/mathematicsoflights/ambient.htm
Título: La luz ambiental
Publicado por: davidgf en 28 de Agosto de 2007, 01:13:33 AM
Gracias pro el link ;)

Pero no hay manera no lo logro. He logrado cosas muy superiores pero esta chorrada (porque es la cosa más estupida que me ha pasado en tiempo) puede conmigo!
Título: La luz ambiental
Publicado por: Pogacha en 28 de Agosto de 2007, 01:16:13 AM
Pues por que en realidad no estas multiplicando por el diffuse. No habrá ningún tipo de iluminación mas que los lightmaps.

Prueba con esto:
Device.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
Device.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE
Device.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
Device.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
Device.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
Device.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
Título: La luz ambiental
Publicado por: davidgf en 28 de Agosto de 2007, 12:30:55 PM
Pogacha diria k hay un error en tu código es un 1 por un 2 en la 2a linia.

Bueno me explico:

Pogacha tu código funciona a las mil maravillas para combinar lightmaps con ambient u otoro tipo de lighting DX.

Pero para una geometria exactamente igual sin lightmappear que States uso?
He provado con las 3 primeras linias y haciendo disable en el 2 pase, pero no funciona y no se porqué.

He de decir que estos modelos que no puedo iluminar (bueno desiluminar porque aparecen iluminados al maximo cosa que no quiero) proceden de Cal3D la libreria de animacion de personajes.

Alguna ayudita "más"?

Muchas gracias por vuestra ayuda! Ya estoy más cerca...
Título: La luz ambiental
Publicado por: Pogacha en 28 de Agosto de 2007, 06:49:48 PM
CitarPogacha diria k hay un error en tu código es un 1 por un 2 en la 2a linia.
Sip  :oops:

Creeria que con esto tienes:

Device.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
Device.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
Device.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
Device.SetTextureStageState 1, D3DTSS_COLOROP,  D3DTOP_DISABLE

Mas alla de eso no creo poder ayudarte.