Cuando se usan texturas en GLSL, es mejor calcular las coordenadas de textura finales en el sombreador de vértices y entregarlas al sombreador de fragmentos usando varying
s. Ejemplo con un simple giro en la 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);
// ...
}
Si el giro en la coordenada y, o una operación aún más simple como agregar vec2(0.5)
a la coordenada de textura se realiza en el sombreador de fragmentos, el acceso a la textura es mucho más lento. ¿Por qué?
Como nota, por ejemplo, mezclar dos texturas, usando una suma ponderada de ellas, es mucho más barato en términos de tiempo y también debe hacerse para cada píxel, por lo que el cálculo de la coordenada de textura en sí no parece ser tan costoso.
performance
glsl
fragment-shader
Nerón
fuente
fuente
Respuestas:
Lo que estás hablando se llama comúnmente "lecturas de textura dependientes" en la comunidad de desarrollo móvil. Es un detalle de implementación de cierto hardware y, por lo tanto, realmente depende de la GPU en cuanto a si tiene o no implicaciones de rendimiento. Por lo general, es algo que ves mencionado para las GPU PowerVR en el hardware de Apple, ya que se mencionó explícitamente tanto en Imagination como en Appledocumentación. Si no recuerdo mal, el problema básicamente vino del hardware en la GPU que comenzaría a buscar texturas antes de que el sombreador de fragmentos incluso comenzara a ejecutarse, de modo que podría hacer un mejor trabajo al ocultar la latencia. Los documentos que vinculé mencionan que ya no es un problema en el hardware de la Serie 6, por lo que al menos en el hardware más nuevo de Apple no es algo de lo que deba preocuparse. Sinceramente, no estoy seguro acerca de otras GPU móviles, ya que esa no es mi área de especialización. Debe intentar y consultar su documentación para saber con certeza.
Si decide realizar algunas búsquedas en Google sobre este tema, tenga en cuenta que probablemente encontrará material más antiguo que habla de recuperaciones de texturas dependientes en hardware de escritorio más antiguo. Básico en los primeros días de los sombreadores de píxeles / fragmentos, el término "recuperación de textura dependiente" se refería al uso de una dirección UV que dependía de una recuperación de textura previa. El ejemplo clásico fue la representación de mapas de entorno con mapas de relieve, donde deseaba usar un vector de reflexión basado en el mapa normal para muestrear el mapa de entorno. En este hardware antiguo había algunas implicaciones importantes de rendimiento, y creo que ni siquiera era compatible con algunas GPU muy antiguas. Con las GPU modernas, el hardware y el sombreador ISA están mucho más generalizados, por lo que la situación de rendimiento es mucho más complicada.
fuente