Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cosas Raras Con Perpixel Lightning

Iniciado por Haddd, 10 de Julio de 2004, 06:06:36 PM

« anterior - próximo »

Haddd

 Os cuento. Mirad esta imagen:


La luz está muy cerca de la pared de fondo, que como no hace sombra puede despistar.

Bien, primero empezé con la pared de fondo, y todo iba perfectamente. Luego puse la pared del suelo. Esta pared es el mismo objeto que la del fondo, pero con una matriz WORLD diferente. Esto es importante, pq ambas tienen el mismo vertexbuffer. Pues cuando dibujé el de abajo, no me lo iluminaba si la luz no estaba por debajo del suelo, es decir, que parecía que la normal estaba al revés. Entonces modifiqué el shader para que en lugar de pasar a World Space pasara a Object Space(usando IWorld). Y me funcionó, pero con los problemas de la imagen.

Por tanto, hay algo que hago mal y que se me escapa. Por ello he subido el programa con el shader, a ver si alguien puede ayudarme y sacarme de esta duda que me atosiga. (grrr)

Gracias

Ese enlace de ayuda

tamat

 pero es que la pared del fondo tambien está mal, fijate que las zonas iluminadas del relieve son las que no estan encaradas a la luz :S
Por un stratos menos tenso

Helius

 Me pasa algo muy parecido a mi, yo creo que estoy generando mal los vectores del tangent space  :( Si dices que te funcionaba bien con una pared igual los estás transformando mal...
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

BeRSeRKeR

 ¿Las matrices se las pasas traspuestas o normal?. No sé con los fx, pero programando los shaders a pelo, las matrices había que pasárselas traspuestas.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 Con los fx al hacer effect->SetMatrix, DX las transpone.

Venga Berk, ¿no les nada raro al shader?

Podeis hacer pruebas con el shader y ejecutar el programa, así sabreis si el cambio es correcto :lol:

Socorrooo :blink:  

Zaelsius

 Yo he estado mirándolo un poco, con el reference rasterizer y el 3danalyzer(no tengo hardware dx9 aun).

Al mover un poco la luz(bueno, a mis 0.2 fps no sé si estoy moviendo la luz u otra cosa), se me queda la cosas así:



Parece que hay un cambio brusco entre los polígonos de la pared(aunque es curioso porque no son exactamente triángulos, con lo cual el error podria no tener  nada que ver con los polys).

Tambien estuve jugando con esta linea, por marear un poco(yo de shaders tengo poquísima idea):

// Interpolamos entre una normal plana y el valor recogido en el bump. Los valores de smooth están en tangent space
float3 smooth = { 0.5f, 0.5f, 1.0f };


Pero para mi sorpresa el resultado visual es prácticamente el mismo siempre.. no sé si será cosa del refRast, o qué.. bueno repito q de este tema no tengo mucha idea  :P

Suerte

PD: Sí, he retocado la imagen y subido el brillo para apreciar mejor las discontinuidades.

BeRSeRKeR

 La verdad es que esa línea que hay en medio de la pared a la que hace referencia Zaelsius también me ha llamado la atención ya que no coincide con la arista de ningún triángulo. Con el wireframe se ve claramente lo raro que es que haya una línea en ese lugar:



¿Seguro que la tangente está bien calculada?.

Ahora mismo no dispongo de mi ordenador para hacer pruebas en condiciones pero a ver si le puedo echar un vistazo.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 He modificado el vertex & pixel shader para que haga per-fragment lighting sin normal mapping ni tangent-space ni historias de esas, para simplificar las cosas y poder detectar errores de base.

El resultado es que la iluminación es correcta (nada de las cosas raras que ocurren utilizando normal mapping) salvo en una cosa. Y es que parece que la matriz IWorld (que es la que se utiliza para pasar la posición de la luz de world a object-space) no parece ser correcta.

Me explico.

Nada más abrirse la aplicación se ve en frente de la cámara el quad que por lo visto está centrado en el origen de coordenadas y sus coordenadas máxima y mínima son <5, 5, 0> y <-5, -5, 0> respectivamente.

El problema está en que, viendo el comportamiento de la luz, es como si la matriz IWorld hiciera "casi" bien las rotaciones pero no las traslaciones. De hecho no traslada nada. Tan sólo rota alrededor del origen de coordenadas y encima parece que lo hace al revés.

Así, por ejemplo, las coordenadas que "ve la luz" para el quad de la derecha no serían:

máximo: <5, 5, 10>
mínimo: <5, -5, 0>
normales: <-1, 0, 0>

que son las coordenadas del quad que podemos ver nosotros, sino:

máximo: <0, 5, 5>
mínimo: <0, -5, -5>
normales: <1, 0, 0>

Así que estaría bien ver el código de la aplicación para ver la construcción de las matrices. ¡Si puede ser, claro!. :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 Creo que la he líado con los máximos y los mínimos. :lol:

A ver, las coordenadas del quad (de la derecha) que se renderiza son:

<5, 5, 0>
<5, 5, -10>
<5, -5, -10>
<5, -5, 0>

Normal: <-1, 0, 0>

Las coordenadas del quad (de la derecha) que "ve" la luz:

<0, 5, 5>
<0, 5, -5>
<0, -5, -5>
<0, -5, 5>

Normal: <1, 0, 0>

A ver si ahora lo he puesto bien. :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 Muchísimas gracias a todos. ¡Ya entiendo el Tangent Space! Bien, os explico:

1. Las líneas que aparecen en la mitad del rectángulo, que muy bien habeis notado son debidas a que el Tanget Space está MAL calculado. La funcion de D3DX no funciona correctamente o yo no lo hago de la forma correcta. La cuestión es que en un rectángulo de este estilo, la normal debe ser (0,0,-1) y la Tangente(1,0,0). Pues bien, los datos de vértice, normal y tangente son:
 
  0: v(0.00,0.00,0.00) n(0.00,0.00,-1.00) t(1.00,0.00,0.00)
  1: v(5.00,0.00,0.00) n(0.00,0.00,-1.00) t(1.00,0.00,0.00)
  2: v(10.00,0.00,0.00) n(0.00,0.00,-1.00) t(-1.00,0.00,0.00)
  3: v(0.00,5.00,0.00) n(0.00,0.00,-1.00) t(1.00,0.00,0.00)
  4: v(5.00,5.00,0.00) n(0.00,0.00,-1.00) t(0.00,0.00,0.00)
  5: v(10.00,5.00,0.00) n(0.00,0.00,-1.00) t(-1.00,0.00,0.00)
  6: v(0.00,10.00,0.00) n(0.00,0.00,-1.00) t(1.00,0.00,0.00)
  7: v(5.00,10.00,0.00) n(0.00,0.00,-1.00) t(-1.00,0.00,0.00)
  8: v(10.00,10.00,0.00) n(0.00,0.00,-1.00) t(-1.00,0.00,0.00)

No sé la razón, si alguien la sabe, por favor que me la explique. Yo utilizo:


D3DXComputeTangent(MeshData.pMesh,0,0,D3DX_DEFAULT,1,NULL);


Bien, pues arreglando la tangente resolví el problema de la línea blanca. Después ya entiendo porque tengo que utiliza la inversa de World en lugar de World y porqué se convierte a Tangent Space. Si tengo tiempo escribiré un documento y lo publicaré, así quedará documentado y comparto conocimientos para que otros puedan compartirlo conmigo, como habeis hecho vosotros. (ole)

Muchas gracias a todos de nuevo.
;)  

Lord Trancos 2

Cita de: "Haddd"Bien, pues arreglando la tangente resolví el problema de la línea blanca. Después ya entiendo porque tengo que utiliza la inversa de World en lugar de World y porqué se convierte a Tangent Space. Si tengo tiempo escribiré un documento y lo publicaré, así quedará documentado y comparto conocimientos para que otros puedan compartirlo conmigo, como habeis hecho vosotros. (ole)
(ole)

on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Helius

 Ese documento me vendría bien porque tengo problemas para crear el tangent space de un vértice ;)
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

BeRSeRKeR

 ¡Ya sabía yo que la tangente no estaba bien! :lol:

Hey Helius, échale un vistazo a este hilo de flipcode. Tal vez te ayude.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Helius

 Muchas gracias por tu ayuda Berserker, me voy a mirar todo lo que me as dicho ;)
Por cierto, tiene buena pinta el último enlace que me has puesto, gracias :)
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.






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.