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.
Réponses:
Ce dont vous parlez est communément appelé "lectures de texture dépendantes" dans la communauté du développement mobile. C'est un détail d'implémentation de certains matériels, et donc cela dépend vraiment du GPU pour savoir s'il a ou non des implications en termes de performances. En général, c'est quelque chose que vous voyez soulevé pour les GPU PowerVR dans le matériel Apple, car il a été explicitement mentionné dans Imagination et AppleDocumentation. Si je me souviens bien, le problème venait essentiellement du matériel du GPU qui commencerait à pré-récupérer les textures avant même que le shader de fragment ne commence à s'exécuter, afin qu'il puisse mieux masquer la latence. Les documents que j'ai liés mentionnent que ce n'est plus un problème sur le matériel Series6, donc au moins sur le matériel Apple plus récent, ce n'est pas quelque chose dont vous devez vous inquiéter. Honnêtement, je ne suis pas sûr des autres GPU mobiles, car ce n'est pas mon domaine d'expertise. Vous devriez essayer de consulter leur documentation pour en être sûr.
Si vous décidez de faire des recherches Google sur ce problème, sachez que vous trouverez probablement des documents plus anciens qui parlent de récupérations de texture dépendantes sur du matériel de bureau plus ancien. Basique au début des shaders de pixels / fragments, le terme «extraction de texture dépendante» faisait référence à l'utilisation d'une adresse UV qui reposait sur une extraction de texture précédente. L'exemple classique était le rendu de carte d'environnement bump-mappé, où vous vouliez utiliser un vecteur de réflexion basé sur la carte normale afin d'échantillonner la carte d'environnement. Sur ce matériel plus ancien, il y avait des implications de performances majeures, et je pense qu'il n'était même pas pris en charge sur certains très anciens GPU. Avec les GPU modernes, le matériel et le shader ISA sont beaucoup plus généralisés, et donc la situation des performances est beaucoup plus compliquée.
la source