Pregunta

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

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

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

Entonces quiero repetir ese sprite N veces a una franja triangular (o cuadrilátero) 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 pasó el rango [0,1].Sin embargo, esto no funciona:(tratando de repetir N = 10)

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

Estamos viendo repetido nuestro atlas de texturas completo...

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

¿Fue útil?

Solución

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 tuviera una textura cuadrada que quisiera repetir varias veces (digamos seis) sobre un área más grande, dibujaría un rectángulo que sea seis veces más ancho que alto. Luego establecería las coordenadas de textura en (0,0) - (6,1), y el modo de textura en & Quot; repita & Quot ;. Al interpolar a través del polígono, la coordenada de textura que va más allá de 1, debido a que la repetición está habilitada, & "; Ajusta alrededor de &"; 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 algún subconjunto arbitrario. cuando estás texturizando usando solo una parte de la textura, no hay forma 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 textura de manera apropiada.

Otros consejos

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 & Quot; sub-texturas & Quot ;, para que sus coordenadas de textura nunca se acerquen a 0 y 1, los límites normales donde se produce el ajuste y la sujeción.

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

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 tuviera una textura cuadrada que quisiera repetir varias veces (digamos seis) sobre un área más grande, dibujaría un rectángulo que sea seis veces más ancho que alto. Luego establecería las coordenadas de textura en (0,0) - (6,1), y el modo de textura en & Quot; repita & Quot ;. Al interpolar a través del polígono, la coordenada de textura que va más allá de 1, debido a que la repetición está habilitada, & "; Ajusta alrededor de &"; 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 forma de especificar esa coordenada de textura más grande de una manera que haga que OpenGL la repita solo dentro del sub-rectángulo.

Ninguno de los modos de ajuste de textura admite el tipo de operación que está buscando, es decir, todos se asignan al rango completo [0,1], no a algún 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 textura adecuadamente.

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

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

Ej .: Tengo una textura láser contenida dentro de un atlas de textura más grande, en U [0.05 - 0.1] & Amp; V [0,05-0,1].

Entonces construiría N mallas, cada una con U [0.05-0.1] & amp; V [0.05-0.1] coordenadas. (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 recargar textura tras textura. Especialmente si agrupa todas las llamadas de procesamiento (como debería).

(OpenGL ES 1.0,1.1,2.0 - Hardware móvil 2011)

No se puede hacer ...

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