una tutorial texture texturas textura sirve que para multiples gltexcoord2f example opengl texture-mapping quad

tutorial - texture in opengl c++



textura mapeando un trapezoide con una textura cuadrada en OpenGL (2)

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

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

Parcialmente copiado y adaptado del enlace de arriba, creado por Cass

Uno de los aspectos más interesantes del mapeo de textura 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 a veces se vuelve problemático.

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

OpenGL dividirá el quad 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 la coordenada 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 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 mapea la textura.

El espacio de texturas no es simplemente un plano afín 2D, aunque generalmente dejamos r = 0 yq = 1defaults 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 (s, t) las coordenadas 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 MIRAR lo que le sucedió a ds / dx - ¡ahora es lo mismo para ambos triángulos! Ambos tienen los mismos dq / dx y dq / dy también.

Tenga en cuenta que todavía está en el plano z = 0. Puede llegar a ser bastante confuso cuando se usa 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 es para que tú decidas.

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

Normalmente, cargaría la textura calculando 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 simplificar este proceso para mí.

He buscado en la Web y he visto "Perspectiva: texturas correctas, coordenadas Q y GLSL" y "mapeo de textura sesgada / esquilada en OpenGL" .

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

Actualizar:

He estado leyendo "Navegando en entornos estáticos usando la simplificación y la transformación de imágenes y espacios" [ PDF ] - página 9 apéndice A.

Parece que desactivan 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.

por lo tanto, para una coordenada de textura dada (s, r, t, q) para un quad que tiene la forma de un trapecio, 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 estoy perdiendo un paso? como jugar con GL_TEXTURE glMatrixMode?

Actualización # 2:

Eso hizo el truco! Téngalo en cuenta, amigos, este problema está en toda la web y no hubo respuestas fáciles. La mayoría de los involucrados directamente recalcular la textura con una homografía entre la forma original y la forma transformada ... alias muchos álgebra lineal y una dependencia BLAS lib externa.


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

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

La mayoría de las soluciones aquí en SO caen 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 rectos. En mi caso, el trapecio era regular, por lo que un cuadrante y dos triángulos resolvieron el problema.