Por que é possível encontrar uma coordenada de textura maior que 1 ou menor que 0

11

Estou estudando um texto sobre texture mappinge, na preparing to drawsessão, li:

Defina os parâmetros de quebra de textura. Isso controlará o que acontece quando uma coordenada de textura maior que 1,0 ou menor que 0,0 é encontrada:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

onde wrap é:
GL_REPEAT: especifica que esse padrão será repetido (ou seja, wrap-around) se forem encontradas coordenadas de textura transformadas menores que 0.0 ou maiores que 1.0.

GL_CLAMP: especifica que o padrão irá "aderir" ao valor em 0,0 ou 1,0.

Mas não há explicação qual é o motivo de encontrar essas coordenadas de textura?
Por exemplo, suponha que eu tenha acabado de desenhar um retângulo e deseje aplicar uma imagem como textura nela, é possível encontrar essas coordenadas?

Sepideh Abadpour
fonte

Respostas:

5

Nem todas as texturas usam coordenadas de textura provenientes dos dados da malha. Por exemplo, com texturas projetivas , você transforma o mundo no espaço da textura. Bem, muito desse mundo fica fora da faixa [0, 1] da textura. Sem algum tipo de modo de fixação, você terá problemas.

Nicol Bolas
fonte
10

Precisamente, para repetir uma textura.

Portanto, se você possui um quadrilátero e as coordenadas da textura variam de 0 a 1, a textura será desenhada uma vez. Se as coordenadas forem de 0 a 2 e o agrupamento estiver definido como GL_REPEAT, a textura será desenhada duas vezes.

Experimente e veja você mesmo

Panda Pajama
fonte
ok @Panda Pajama, para um código como este: float x0 = 0; // canto superior esquerdo da imagem float y0 = 0; flutuar x1 = x0 + ImageWidth; // canto inferior direito da imagem float y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } não há possibilidade de encontrar coordenadas de textura além do intervalo (0,1)?
Sepideh Abadpour
1
@sepideh: Claro que não. Você manteve especificamente suas coordenadas de textura no intervalo [0, 1]. O que você não entende é que não precisa ; você poderia ter feito qualquer coisa para eles. Além disso, não poste um monte de código nos comentários. Se você deseja esclarecimentos, edite sua pergunta.
Nicol Bolas
ok obrigado por sua orientação sobre a passagem de códigos para minha pergunta. Eu estava procurando uma maneira de formatar códigos em comandos, mas não consegui encontrar !!! Então você quer dizer que encontrar essas coordenadas não é um evento possível em tempo de execução. É apenas especificado pelo programador claramente, a fim de repetir a textura ou não.
Sepideh Abadpour
1
@sepideh O que significa "não é possível um evento possível em tempo de execução"? É perfeitamente bom alterar seu código no comentário, glTexCoord2f(0, 2);por exemplo. Isso tem um significado bem definido muito específico no código e quando o programa está sendo executado. Se você vir isso, o programador fez isso intencionalmente porque fornece o resultado que deseja.
Joseph Mansfield
2
@sepideh Claro. O OpenGL usa quaisquer valores que você especificar. Se você atribuir valores no intervalo de 0 a 1, nunca receberá mais nada.
Joseph Mansfield
5

Sim, você pode encontrar coordenadas de textura maiores que 1.0e menores que 0.0.

Isso depende completamente do modelo que você carregou. Normalmente, para cada vértice, há coordenadas de posição, normal e de textura armazenadas. Na maioria dos formatos de arquivo de malha, a coordenada da textura não está restrita a nenhum intervalo.

Isso é usado para repetir uma textura . Por exemplo, para abranger uma textura quatro vezes entre um quad de vértices, as coordenadas de textura seria 0,0, 0,4, 4,0e 4,4. Sem textura de embrulho, você precisaria de vértices adicionais para dividir a superfície em 4 vezes 4 sub superfícies com cada um as coordenadas de textura 0,0, 0,1, 1,0, 1,1. Menos vértices resultam em melhor desempenho de renderização.

Normalmente, não é desejado que o usuário observe as bordas de uma textura repetida. Portanto, texturas repetidas são inclináveis ​​na maioria dos casos. Isso significa que a borda direita desvanece-se perfeitamente para a esquerda e a borda superior para a inferior. Dessa forma, a transição é suave e, esperamos, não seja notada pelo usuário.

Um tópico mais avançado, mas relacionado, é ocultar inteligentemente o fato de que a mesma textura foi repetida várias vezes. Por exemplo, misturar texturas repetidas de tamanhos diferentes, por exemplo, uma textura de parede e um adesivo de sujeira, é uma técnica comum.

danijar
fonte
Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Essa é uma explicação prática real! Obrigado!
Amit Tomar