Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





La luz ambiental

Iniciado por davidgf, 26 de Agosto de 2007, 02:08:05 PM

« anterior - próximo »

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

XÑA

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.

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

XÑA

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á.

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

XÑA

¿tienes activado el renderState de Lighting ?

Y quizás necesite tener una luz, aunque luego no la utilice.

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha

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.

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)


davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha

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

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha

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.






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.