2017-07-18 2 views
0

Je travaille sur un projet LWJGL et je suis en train de texturer mon terrain en utilisant une carte de mélange. Voici un exemple très simple:GLSL: Appel plus efficace à la texture pour plusieurs variables sampler2D

#version 400 core 

in vec3 fsh_in_normal; 
in vec2 fsh_in_coords; 
in vec2 fsh_in_scaled; 

out vec4 fsh_out_color; 

uniform sampler2D blend_map; 
uniform sampler2D texture_1; 
uniform sampler2D texture_2; 

void main(void) { 

    vec4 blend_vec = texture(blend_map, fsh_in_coords); 

    vec4 color_tx1 = texture(texture_1, fsh_in_scaled); 
    vec4 color_tx2 = texture(texture_2, fsh_in_scaled); 

    fsh_out_color = mix(color_tx1, color_tx2, blend_vec.r); 

} 

fsh_in_scaled est une version réduite de fsh_in_coords de sorte que les textures appliquées réelles sont vues à une meilleure résolution à l'écran.

Maintenant, voici ma question: texture_1 et texture_2 ont des formats d'image et des tailles identiques (512x512). Donc, quand je les échantillonne avec les mêmes coordonnées, l'ordinateur ne fait-il pas des calculs identiques pour chaque appel à texture(...) jusqu'à ce que la couleur de la texture soit réellement échantillonnée? Ou est-ce que le compilateur l'optimise d'une manière ou d'une autre?

S'il n'est pas optimisé, est-il possible de rationaliser les deux appels texture(...) pour rendre le code plus efficace? J'ai l'intention d'ajouter au moins deux autres textures à la carte de mélange dans le futur et ils seraient de mêmes dimensions et le format que le texture_1 & texture_2 existant.

+0

Le coût principal ici est l'extraction de texture réelle de la mémoire. Ne vous inquiétez pas à moins que votre fragment de shader ne soit assez lent (et mesurez-le!) Que vous devez accélérer. –

+0

Existe-t-il un moyen de rendre les choses plus rapides? Même si cela n'a pas d'importance du tout, il serait toujours intéressant de savoir @DietrichEpp –

+1

La première étape lorsque vous voulez faire quelque chose de plus rapide est de mesurer à quelle vitesse il est, et quelle est la partie lente. Commencez là. –

Répondre

1

L'échantillonnage de texture est effectué à l'aide d'unités de texture matérielle, il n'y a donc aucun moyen de l'optimiser davantage. Le coût principal de la recherche de texture est dans l'accès à la mémoire, vous pouvez donc envisager le mipmapping pour éviter les échecs de cache.

+0

J'ai également généré des mipmaps. La performance elle-même n'est pas un problème en ce moment, juste en essayant d'économiser les calculs gpu gaspillés si possible pour permettre un éclairage plus compliqué et tel sur la route –