2012-05-31 9 views
6

En mi previous question, se estableció que, al texturizar un quad, la cara se divide en triángulos y las coordenadas de textura se interpolan de manera afín.Textura lineal/no lineal Asignación de un Quad distorsionado

Lamentablemente, no sé cómo solucionarlo. El provided link fue útil, pero no da el efecto deseado. El autor concluye: "Tenga en cuenta que la imagen se ve como si fuera un cuadrángulo rectangular largo que se extiende en la distancia ... Puede llegar a ser bastante confuso ... debido a la" falsa percepción de profundidad "que esto produce".

Lo que me gustaría hacer es que la textura mantenga la escala original de la textura. Por ejemplo, en el caso trapezoidal, quiero que el espaciado vertical de los téxeles sea el mismo (ejemplo creado con el programa de pintura):

Observe que, en virtud del espaciado vertical que es idéntico, la distorsión obvia del cuadrante , las líneas rectas en el espacio de textura ya no son líneas rectas en el espacio mundial. Por lo tanto, creo que el mapeo requerido no es lineal.

La pregunta es: ¿esto es posible incluso en la tubería de función fija? Ni siquiera estoy seguro de cuál es la "respuesta correcta" para quads más generales; Imagino que las funciones de interpolación pueden ser muy complicadas muy rápido, y me doy cuenta de que "preservar la escala original" no es exactamente un algoritmo. Los triángulos mundo-espacio ya no son lineales en el espacio de textura.

Dicho sea de paso, no lo sé realmente entienden el 3 rd y 4 º coordina textura; si alguien pudiera indicarme un recurso, sería genial.

Respuesta

0

Wow este es un problema bastante complejo. Básicamente, no estás aportando perspectiva a la ecuación. Tus coord x, y final se dividen por el valor de z que obtienes cuando giras. Esto significa que obtiene un cambio menor en el espacio de textura (s, t) cuanto más lejos se obtiene de la cámara.

Sin embargo, haciendo esto, efectivamente, interpola linealmente a medida que z aumenta. Escribí un ANCIENT demo que hizo esto en 1997. Esto se llama mapeo de textura "afín".

La cosa se debe a que está dividiendo x e y por z, realmente necesita interpolar sus valores usando "1/z". Esto correctamente tiene en cuenta la perspectiva que se aplica (cuando se divide x & y) por z. Por lo tanto, terminas con "perspective correct" texture mapping.

Desearía poder entrar en más detalles que eso, pero en los últimos 15 años impares de alcohol, mi memoria se ha vuelto un poco confusa;) Uno de estos días me encantaría volver a visitar el software de renderizado ya que ' Estoy convencido de que con el lanzamiento de OpenCL, ¡pronto terminará siendo una mejor forma de escribir un motor de renderizado!

De todos modos, espero que sea un poco de ayuda y disculpas, no puedo ser más ayuda.

(Como un lado cuando estaba pensando en todo lo que hace 15 años me encantaba tener todos los recursos a mi disposición ahora, Internet hace mi trabajo y mi vida mucho más fácil. Trabajando todo desde el principio principios fue increíblemente doloroso. Recuerdo que inicialmente probé la interpolación 1/z pero se hizo cada vez más pequeña a medida que se acercaba y abandoné cuando debí haber invertido las cosas ... hasta el día de hoy, ya que mi conocimiento ha aumentado exponencialmente, TODAVÍA me hubiera gustado haber escrito un renderizador "lento" pero totalmente correcto en perspectiva ...un día lo rodearé;))

¡Buena suerte!

Cuestiones relacionadas