Por que o acesso às texturas é muito mais lento ao calcular a coordenada da textura no sombreador de fragmentos?


11

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 varyings. 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.


1
Meu palpite seria que, se as cordas UV forem calculadas no VS, a unidade de textura poderá começar a buscá-las enquanto o PS estiver iniciando. Se eles são calculados no PS, a unidade de textura precisa aguardar primeiro.
precisa saber é o seguinte

2
Fwiw, isso é chamado de "leitura dependente da textura", caso ajude sua pesquisa.
27615 Alan Wolfe

Você tem algumas medidas mostrando a diferença de desempenho? Na verdade, eu não esperava que houvesse muita diferença; a latência de busca de textura deve inundar algumas operações da ALU. BTW, as leituras de textura dependentes são onde há duas (ou mais) leituras de textura, com as coordenadas do segundo dependentes da saída do primeiro. Esses são mais lentos devido à ordem estrita necessária entre as duas leituras de textura.
22615 Nathan Reed

Bem, qualquer operação realizada no shader de fragmento será mais cara que no shader de vértice. Cada triângulo recebe 3 invocações de um sombreador de vértice, mas pode levar ordens de magnitude a mais invocações do sombreador de fragmentos, dependendo do tamanho da tela.
glampert

@NathanReed Eu não acho que você precise limitar a "leitura dependente da textura" apenas àquelas provenientes de um acesso anterior à textura. Eu provavelmente também incluiria quaisquer coordenadas computadas no frag shader, em oposição àquelas que podem ser determinadas apenas a partir da interpolação linear (bem, hiperbólica com perspectiva) dos atributos do vértice.
Simon F

Respostas:


11

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.


A propósito: experimentei isso em um iPad 3. Talvez isso seja realmente específico do hardware.
Nero
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.