tutorial texture texcoord learn opengl graphics textures texture-mapping

texture - ¿Cómo usar GL_REPEAT para repetir solo una selección de un atlas de textura?(OpenGL)



shader in opengl (5)

¿Cómo puedo repetir una selección de un atlas de textura?

Por ejemplo, mi sprite (selección) está dentro de las coordenadas de la textura:

GLfloat textureCoords[]= { .1f, .1f, .3f, .1f, .1f, .3f, .3f, .3f };

Luego quiero repetir ese sprite N veces en una franja de triángulo (o quad) definida por:

GLfloat vertices[]= { -100.f, -100.f, 100.f, -100.f, -100.f, 100.f, 100.f, 100.f };

Sé que tiene algo que ver con GL_REPEAT y textureCoords pasando el rango [0,1] . Sin embargo, esto no funciona: (intentando repetir N = 10)

GLfloat textureCoords[]= { 10.1f, 10.1f, 10.3f, 10.1f, 10.1f, 10.3f, 10.3f, 10.3f };

Estamos viendo nuestro atlas de textura completa repetida ...

¿Cómo haría esto de la manera correcta?


Ninguno de los modos de ajuste de textura es compatible con el tipo de operación que está buscando, es decir, todos se asignan al rango completo [0,1], no a un subconjunto arbitrario. Básicamente, tiene dos opciones: crear una nueva textura que solo tenga el sprite que necesita de la textura existente o escribir un programa de píxeles GLSL para mapear las coordenadas de la textura de manera adecuada.


No estoy seguro de que puedas hacer eso. Creo que los modos de coordenadas de textura de OpenGL solo se aplican a toda la textura. Cuando usa un atlas, está usando "sub-texturas", de modo que sus coordenadas de textura nunca se acerquen a 0 y 1, los límites normales donde se produce el ajuste y la fijación.

Puede haber extensiones para lidiar con esto, no lo he comprobado.

EDITAR: Normalmente, para repetir una textura, dibujarías un polígono que es "más grande" de lo que implica tu textura. Por ejemplo, si tuvieras una textura cuadrada que quisieras repetir varias veces (digamos seis) en un área más grande, dibujarías un rectángulo que es seis veces más ancho que alto. A continuación, establecería las coordenadas de textura en (0,0) - (6,1), y el modo de textura en "repetir". Cuando se interpola a través del polígono, la coordenada de textura que va más allá de 1, debido a que la repetición se habilita, se "envuelve" en la textura, lo que hace que la textura se asigne seis veces a través del rectángulo.

Esto es un poco tosco de explicar sin imágenes.

De todos modos, cuando estás texturizando usando solo una parte de la textura, no hay manera de especificar esa coordenada de textura más grande de manera que OpenGL lo repita solo dentro del sub-rectángulo.


No se puede hacer ...


No se puede hacer como se describe en la pregunta. Los modos de coordenadas de textura de OpenGL solo se aplican a toda la textura.

Normalmente, para repetir una textura, dibujarías un polígono que es "más grande" de lo que implica tu textura. Por ejemplo, si tuvieras una textura cuadrada que quisieras repetir varias veces (digamos seis) en un área más grande, dibujarías un rectángulo que es seis veces más ancho que alto. A continuación, establecería las coordenadas de textura en (0,0) - (6,1), y el modo de textura en "repetir". Cuando se interpola a través del polígono, la coordenada de textura que va más allá de 1, debido a que la repetición se habilita, se "envuelve" en la textura, lo que hace que la textura se asigne seis veces a través del rectángulo.

Ninguno de los modos de ajuste de textura admite el tipo de operación como se describe en la pregunta, es decir, todos se asignan al rango completo [0,1], no a un subconjunto arbitrario. cuando estás texturizando usando solo una parte de la textura, no hay manera de especificar esa coordenada de textura más grande de una manera que haga que OpenGL la repita solo dentro del sub-rectángulo.

Básicamente, tiene dos opciones: crear una nueva textura que solo tenga el sprite que necesita de la textura existente o escribir un programa de vértice GLSL para mapear las coordenadas de la textura de manera adecuada.


Si bien este puede ser un tema viejo; Así es como terminé haciéndolo:

Una solución alternativa sería crear múltiples mallas, pegadas juntas que contengan el subconjunto de los UV de textura.

Por ejemplo: tengo una textura láser contenida dentro de un atlas de textura más grande, en U [0.05 - 0.1] y V [0.05-0.1].

Luego construiría N mallas, cada una con coordenadas U [0.05-0.1] & V [0.05-0.1]. (N = longitud / textura. Altura; la altura es la dimensión de la textura que me gustaría repetir. O más fácil: la cantidad de veces que quiero repetir la textura).

Esta solución sería más rentable que tener que volver a cargar la textura después de la textura. Especialmente si haces un lote de todas las llamadas de render (como deberías).

(OpenGL ES 1.0.1.1,2.0 - Mobile Hardware 2011)