Pregunta

He intentado renderizar un GL_QUAD (que tiene forma de trapezoide) con una textura cuadrada. Me gustaría probar y usar OpenGL solo para lograrlo. En este momento, la textura se está distorsionando mucho y es realmente molesto.

Normalmente, cargaría la textura para calcular una homografía, pero eso significa mucho trabajo y una biblioteca de programación lineal adicional / función de transformación lineal directa. Tengo la impresión de que OpenGL puede simplificarme este proceso.

He buscado en la Web y he visto "Perspective -Corrección de texturas, coordenadas Q y GLSL " y "Asignación de texturas sesgadas / cortadas en OpenGL" .

Todos parecen asumir que harás algún tipo de cálculo de homografía o usarás algunas partes de OpenGL que ignoro ... ¿algún consejo?

<”Actualización:

He estado leyendo "Navegación por entornos estáticos con imágenes Simplificación y transformación del espacio " [ PDF ] - página 9 apéndice A.

Parece que deshabilitan la corrección de perspectiva al multiplicar la coordenada de textura (s, t, r, q) con el vértice del componente z del espacio mundial de un modelo.

así que para una textura determinada coordenada (s, r, t, q) para un quad que tiene forma de trapezoide, donde los 4 componentes son:

(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f) 

¿Esto es tan fácil como glTexCoord4f (s vert.z, r vert.z, t, q * vert.z)? ¿O me estoy perdiendo algún paso? como jugar con GL_TEXTURE glMatrixMode?

Actualización n. ° 2:

¡Eso funcionó! Tengan esto en cuenta, amigos, este problema está en toda la web y no había respuestas fáciles. La mayoría involucró recalcular directamente la textura con una homografía entre la forma original y la forma transformada ... también conocido como un montón de álgebra lineal y una dependencia externa de BLAS lib.

¿Fue útil?

Solución

Aquí hay una buena explicación del problema y la solución.

http://www.xyzw.us/~cass/qcoord/

Parcialmente copiado y adaptado del enlace anterior, creado por Cass

Uno de los aspectos más interesantes del mapeo de texturas es el espacio en el que viven las coordenadas de textura. A la mayoría de nosotros nos gusta pensar en el espacio de textura como un simple plano afín 2D. En la mayoría de los casos, esto es perfectamente aceptable y muy intuitivo, pero hay ocasiones en las que se vuelve problemático.

Por ejemplo, suponga que tiene un quad que es trapezoidal en sus coordenadas espaciales pero cuadrado en sus coordenadas de textura.

OpenGL dividirá el cuadrante en triángulos y calculará las pendientes de las coordenadas de textura (ds / dx, ds / dy, dt / dx, dt / dy) y las usará para interpolar las coordenadas de textura sobre el interior del polígono. Para el triángulo inferior izquierdo, dx= 1 y ds= 1, pero para el triángulo superior derecho, dx <1 mientras que ds= 1. Esto hace que ds / dx para el triángulo superior derecho sea mayor que ds / dx para el inferior. Esto produce una imagen desagradable cuando se asigna la textura.

El espacio de textura no es simplemente un plano afín 2D, aunque generalmente dejamos los valores predeterminados r= 0 yq= 1 solo. ¡Es realmente un espacio proyectivo completo (P3)! Esto es bueno, porque en lugar de especificar las coordenadas de textura para los vértices superiores como coordenadas (s, t) de (0, 1) y (1, 1), podemos especificarlas como coordenadas (s, t, r, q) de (0, ancho, 0, ancho) y (ancho, ancho, 0, ancho)! Estas coordenadas corresponden a la misma ubicación en la imagen de textura, pero MIRE lo que pasó con ds / dx - ¡ahora es lo mismo para ambos triángulos! Ambos tienen el mismo dq / dx y dq / dy también.

Tenga en cuenta que todavía está en el plano z= 0. Puede resultar bastante confuso cuando se utiliza esta técnica con una proyección de cámara en perspectiva debido a la "falsa percepción de profundidad" que esto produce. Aún así, puede ser mejor que usar solo (s, t). Eso lo decides tú.

Otros consejos

Supongo que la mayoría de las personas que desean colocar una textura rectangular en un trapezoide están pensando en uno de dos resultados:

  1. proyección en perspectiva: el trapezoide parece un rectángulo visto desde un ángulo oblicuo.
  2. Transformación "elástica": el trapezoide parece una pieza rectangular de goma que se ha estirado / encogido para darle forma.

La mayoría de las soluciones aquí en SO se encuentran en el primer grupo, mientras que recientemente me encontré en el segundo.

La forma más fácil que encontré para lograr el efecto 2. fue dividir el trapezoide en un rectángulo y triángulos rectángulos.En mi caso, el trapezoide era regular, por lo que un cuádruple y dos triángulos resolvieron el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top