Pergunta

Como posso repetir uma seleção de uma textura atlas?

Por exemplo, meu Sprite (seleção) está dentro das coordenadas de textura:

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

Então eu quero repetir que Sprite N vezes para uma faixa de triângulo (ou quad) definido por:

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

Eu sei que tem algo a ver com GL_REPEAT e textureCoords indo passou a [0,1] gama. Isso, entretanto, não funciona: (tentando repetir N = 10)

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

Estamos vendo nossos atlas textura completos repetido ...

Como eu poderia fazer isso da maneira certa?

Foi útil?

Solução

Ele não pode ser feito da maneira que é descrito na pergunta. textura do OpenGL coordenar modos só se aplicam para toda a textura.

Normalmente, para repetir uma textura, você desenhar um polígono que é "maior" do que a sua textura implica. Por exemplo, se você tivesse uma textura quadrado que você queria repetir várias vezes (digamos seis) sobre uma área maior, você desenhar um retângulo que é seis vezes tão grande como ele é alto. Em seguida, você deve definir as coordenadas de textura para (0,0) - (6,1), e o modo de textura para "repeat". Quando interpolação em todo o polígono, a textura coordenadas que vai além de uma vontade, devido ao repetir a ser ativado, "envolvente" na textura, fazendo com que a textura a ser mapeada seis vezes em todo o retângulo.

Nenhum dos modos envoltório textura apoiar o tipo de operação como descrito na pergunta, ou seja, todos eles mapa para a plena [0,1] gama, e não um subconjunto arbitrário. Quando você está texturização utilizando apenas uma parte da textura, não há nenhuma maneira de especificar que a textura maior coordenar de uma maneira que faz com OpenGL repeti-lo dentro de apenas o sub-retângulo.

Você tem basicamente duas opções:. Ou criar uma nova textura que só tem o sprite que você precisa da textura existente ou escrever um programa GLSL vertex para mapear as coordenadas de textura adequada

Outras dicas

Eu não tenho certeza que você pode fazer isso. Eu acho que a textura do OpenGL coordenar modos só se aplicam para toda a textura. Ao usar um atlas, você está usando "sub-texturas", para que as suas coordenadas de textura nunca chegou perto de 0 e 1, os limites normais, onde acondicionamento e fixação ocorre.

Pode haver extensões para lidar com isso, eu não tenho verificado.

EDIT: Normalmente, para repetir uma textura, você desenhar um polígono que é "maior" do que a sua textura implica. Por exemplo, se você tivesse uma textura quadrado que você queria repetir várias vezes (digamos seis) sobre uma área maior, você desenhar um retângulo que é seis vezes tão grande como ele é alto. Em seguida, você deve definir as coordenadas de textura para (0,0) - (6,1), e o modo de textura para "repeat". Quando interpolação em todo o polígono, a textura coordenadas que vai além de uma vontade, devido ao repetir a ser ativado, "envolvente" na textura, fazendo com que a textura a ser mapeada seis vezes em todo o retângulo.

Este é um pouco bruto para explicar sem imagens.

De qualquer forma, quando você está texturização utilizando apenas uma parte da textura, não há nenhuma maneira de especificar que a textura maior coordenar de uma maneira que faz com OpenGL repeti-lo dentro de apenas o sub-retângulo.

Nenhum dos modos envoltório textura apoiar o tipo de operação que você está procurando, ou seja, todos eles mapa para a plena [0,1] gama, e não um subconjunto arbitrário. Você tem basicamente duas opções:. Ou criar uma nova textura que só tem o sprite que você precisa da textura existente ou escrever um programa de pixel GLSL para mapear as coordenadas de textura adequada

Embora isso possa ser um tópico antigo; aqui está como eu acabei fazendo isso:

Uma solução alternativa seria criar múltiplas malhas, colados um ao outro contendo o subconjunto de da Textura UV.

Ex .: I têm uma textura de laser contido dentro de um atlas de textura maiores, em L [0,05-0,1] & V [0,05-0,1].

eu então construir malhas n, tendo cada L [0,05-0,1] & V [0,05-0,1] coordenadas. (.. N = comprimento / texture.height, altura sendo a dimensão da textura que eu gostaria de repetir ou mais fácil: a quantidade de vezes que deseja repetir a textura)

Esta solução seria mais rentável do que ter de textura de recarga depois de textura. Especialmente se você lote tudo tornar chamadas (como deveria).

(OpenGL ES 1.0,1.1,2.0 - Hardware Mobile 2011)

Não pode ser feito ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top