Lorsque vous utilisez des textures dans GLSL, il est préférable de calculer les coordonnées de texture finales dans le vertex shader et de les remettre au fragment shader à l'aide de varying
s. Exemple avec un simple retournement dans la coordonnée 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 le retournement dans la coordonnée y, ou une opération encore plus simple comme l'ajout vec2(0.5)
à la coordonnée de texture est effectuée dans le fragment shader, l'accès à la texture est beaucoup plus lent. Pourquoi?
Remarque: par exemple, le mélange de deux textures, en utilisant une somme pondérée d'entre elles, est beaucoup moins cher en termes de temps et doit également être effectué pour chaque pixel, de sorte que le calcul de la coordonnée de texture elle-même ne semble pas être si coûteux.