¿Por qué el acceso a las texturas es mucho más lento al calcular la coordenada de textura en el sombreador de fragmentos?

11

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

Nerón
fuente
1
Supongo que si los códigos UV se calculan en VS, la unidad de textura puede comenzar a captarlos previamente mientras se inicia el PS. Si se calculan en la PS, la unidad de textura tiene que esperar primero.
RichieSams
2
Ahora esto se llama "lectura de textura dependiente", en caso de que ayude a su búsqueda.
Alan Wolfe
¿Tiene algunas medidas que muestran la diferencia de rendimiento? De hecho, no esperaría que hubiera mucha diferencia en absoluto; la latencia de búsqueda de textura debería inundar algunas operaciones de ALU. Por cierto, las lecturas de textura dependientes son donde hay dos (o más) lecturas de textura, y las coordenadas para el segundo dependen de la salida del primero. Esos son más lentos debido al estricto orden requerido entre las dos lecturas de textura.
Nathan Reed
Bueno, cualquier operación realizada en el sombreador de fragmentos será más costosa que en el sombreador de vértices. Cada triángulo requiere 3 invocaciones de un sombreador de vértices, pero puede requerir órdenes de magnitud más invocaciones del sombreador de fragmentos, dependiendo del tamaño de su pantalla.
glampert
@NathanReed No creo que tenga que limitar las "lecturas de textura dependientes" a solo aquellas que provienen de un acceso de textura anterior. Probablemente también incluiría cualquier coordenada calculada en el sombreador de fragmentos, a diferencia de las que se pueden determinar simplemente a partir de la interpolación lineal (bueno, hiperbólica con perspectiva) de los atributos de vértice.
Simon F

Respuestas:

11

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.

MJP
fuente
Por cierto: lo experimenté en un iPad 3. Entonces, tal vez esto sea realmente específico del hardware.
Nero