Ao usar texturas no GLSL, é melhor calcular as coordenadas finais da textura no shader de vértice e entregá-las ao shader de fragmento usando varying
s. Exemplo com um simples giro na coordenada y:
// Vertex shader
attribute vec2 texture;
varying highp vec2 texCoord;
// ...
void main() {
texCoord = vec2(texture.x, 1.0-texture.y);
// ...
}
// Fragment shader
varying highp vec2 textureCoordinates;
uniform sampler2D tex;
// ...
void main() {
highp vec4 texColor = texture2D(tex, texCoord);
// ...
}
Se o giro na coordenada y, ou uma operação ainda mais simples, como adicionar vec2(0.5)
à coordenada da textura, for realizada no sombreador de fragmentos, o acesso à textura será muito mais lento. Por quê?
Como uma observação, por exemplo, misturar duas texturas, usando uma soma ponderada delas, é muito mais barato em termos de tempo e também precisa ser feito para cada pixel; portanto, o cálculo da coordenada da textura em si não parece tão dispendioso.
Respostas:
O que você está falando é comumente chamado de "leituras de textura dependente" na comunidade de desenvolvimento móvel. É um detalhe de implementação de determinado hardware e, portanto, depende realmente da GPU para saber se tem ou não implicações no desempenho. Normalmente, é algo que você vê apresentado nas GPUs PowerVR no hardware da Apple, uma vez que foi mencionado explicitamente no Imagination e no Appledocumentação. Se bem me lembro, o problema veio basicamente do hardware na GPU que começava a buscar previamente as texturas antes mesmo de o shader de fragmento começar a ser executado, para que ele pudesse fazer um trabalho melhor de ocultar a latência. Os documentos que vinculei mencionam que não é mais um problema no hardware da Series6; portanto, pelo menos no hardware mais recente da Apple, não é algo com que você precise se preocupar. Sinceramente, não tenho certeza sobre outras GPUs móveis, pois essa não é minha área de especialização. Você deve tentar consultar a documentação deles para ter certeza.
Se você decidir fazer algumas pesquisas no Google sobre esse problema, esteja ciente de que provavelmente encontrará algum material mais antigo que fala sobre busca de texturas dependentes em hardware de desktop mais antigo. Básico nos primeiros dias dos shaders de pixel / fragmento, o termo "busca de textura dependente" se referia ao uso de um endereço UV que dependia de uma busca de textura anterior. O exemplo clássico foi a renderização de mapa de ambiente com mapeamento de bump, em que você deseja usar um vetor de reflexão com base no mapa normal para obter uma amostra do mapa de ambiente. Nesse hardware antigo, havia algumas implicações importantes no desempenho, e acho que ele nem era suportado em algumas GPUs muito antigas. Com as GPUs modernas, o ISA de hardware e shader é muito mais generalizado e, portanto, a situação de desempenho é muito mais complicada.
fonte