2011-03-24 20 views
9

Estoy escribiendo un procesador de software que actualmente está funcionando bien, pero estoy tratando de obtener una corrección de la perspectiva de las coordenadas de la textura y eso no parece ser correcto. Estoy usando todas las mismas matemáticas matriciales que OpenGL para mi procesador. Para rasterise un triángulo hago lo siguiente:corrección de la perspectiva de las coordenadas de la textura en 3d

  1. transformar los vértices utilizando las matrices de proyección y modelview, y se transforman en coordenadas del clip.

  2. para cada píxel en cada triángulo, calcular coordenadas baricéntricas a interpolar propiedades (color, coordenadas de textura, normales etc.)

  3. para corregir perspectiva que utilizo perspectiva interpolación correcta: (W es la coordenada de profundidad vértice, c es la coordenada de la textura de vértice, b es el peso barycentric de un vértice)

1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2) 
c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2) 
c = (c/w)/(1/w) 

Esto debería corregir la perspectiva, y ayuda un poco, pero todavía hay un problema de perspectiva obvio. ¿Me estoy perdiendo algo aquí, tal vez algunos problemas de redondeo (estoy usando flotadores para todas las matemáticas)?

Ver en esta imagen el error en las coordenadas de la textura evidente a lo largo de la diagonal, este es el resultado de haber hecho la división por coordenadas de profundidad.

image showing incorrect perspective correction

Además, esto se hace generalmente de coordenadas de textura ... es necesario que otras propiedades (por ejemplo, las normales, etc.), así?

+1

Las capturas de pantalla podrían ser útiles. – genpfault

+0

No puedo agregar una captura de pantalla hasta que tenga una calificación de 10 :( –

+1

usted tiene la calificación ahora: D – Bahbar

Respuesta

1

Sí, se parece a la abolladura de perspectiva rota tradicional. Sin embargo, su algoritmo se ve bien, así que no estoy seguro de qué podría estar mal. Comprobaría que en realidad está utilizando el valor recién calculado más adelante cuando lo renderice. Esto realmente parece que se tomó la molestia de calcular el valor correcto de la perspectiva, y luego usó el valor básico no corregido para la representación.

+0

Al solo mirar los números, la diferencia entre los códigos de tex corregidos y no corregidos es de la orden de 1.0e-4 (tex coords en el rango [0.0,1.0]). ¿Quizás hay un problema de escalamiento? ¿Estoy en lo correcto al usar la coordenada de profundidad del clip para la escala? –

2

debe informar a OpenGL que necesita corrección de la perspectiva de píxeles con

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST) 

lo que está observando es la distorsión típica de mapeado de texturas lineal. En hardware que no es capaz de corrección de perspectiva por píxel (como por ejemplo, la PS1), la solución estándar solo se subdivide en polígonos más pequeños para hacer que el defecto sea menos perceptible.

+0

Este es un procesador de software, no opengl (creo que un mod agregó esa etiqueta) ... pero estoy usando la matemática opengl para todas las transformaciones. –

+0

Lo siento ... vi la etiqueta OpenGL y asumí que estabas usando OpenGL (que debería cambiar a la representación del software si el hardware es no es capaz de proporcionar una función). De todos modos, lo que está observando es el llamado problema de "proyección de perspectiva lineal" y ocurre cuando se calculan los valores UV correctos para los vértices, pero la policilina linealmente nterpolate al renderizar un polígono. – 6502

2

La única transformación correcta de las coordenadas UV a un plano 3D es una transformación homográfica.

http://en.wikipedia.org/wiki/Homography

Debe tenerlo en algún momento de sus cálculos.

Para encontrarlo usted mismo, puede escribir la proyección de cualquier píxel de la textura (lo mismo que para el vértice) e invertirlos para obtener coordenadas de textura a partir de las coordenadas de la pantalla. Aparecerá en forma de transformada homográfica.

2

He descifrado recientemente el código sobre este tema.Puede usar una homografía si planea modificar la textura en la memoria antes de asignarla a la superficie. Eso es computacionalmente costoso y agrega una dependencia adicional a su programa. Hay un buen truco que solucionará el problema para ti.

OpenGL aplica automáticamente la corrección de perspectiva a la textura que está renderizando. Todo lo que necesita hacer es multiplicar las coordenadas de su textura (UV - 0.0f-1.0f) por el componente Z (profundidad espacial mundial de un vector de posición XYZ) de cada esquina del plano y "arrojará" la corrección de perspectiva de OpenGL .

Pedí y resolví este problema recientemente. Dar a este enlace de un tiro:

texture mapping a trapezoid with a square texture in OpenGL

El documento leí que fija este problema se llama, "Navigating Static Environments Using Image-Space Simplification and Morphing" - page 9 appendix A.

Espero que esto ayude!

ct

Cuestiones relacionadas