2016-08-14 2 views
0

Est-il possible de lier une texture à deux (ou plusieurs) échantillonneurs uniformes différents dans openGL? Lors du rendu avec deux textures différentes, il va comme ceci:Lier une texture à deux échantillonneurs uniformes différents

Shader:

uniform sampler2D texture1; 
uniform sampler2D texture2; 
.... 

Client:

//Initial shader program setup. 
glLinkProgram(program); 

GLuint texture1Loc = glGetUniformLocation(program, "texture1"); 
GLuint texture2Loc = glGetUniformLocation(program, "texture2"); 

glUseProgram(program); 
glUniform1i(texture1Loc, 0); //Texture unit 0 is for texture1 sampler. 
glUniform1i(texture2Loc, 1); //Texture unit 1 is for texture2 sampler. 

//When rendering an object with this program. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, texture2); 

//Render stuff 
glDraw*(); 

Mais lorsque je tente de lier l'objet d'une texture à deux unités de texture différentes, il semble que l'unité qui a été reliée en premier reste non liée:

glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, texture1); // bind texture1 
glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, texture1); // bind texture1 - again, but to another unit 

Bien sûr, il est possible de définir la même unité pour les deux échantillonneurs, mais de temps en temps, je veux aussi utiliser mon shader pour différentes textures - pas seulement pour définir l'objet de texture des deux samplers. Cette solution fonctionne très bien, mais elle ne me convient pas comme décrit. Il est également possible de changer l'unité de texture pour un échantillonneur juste avant la liaison, mais cela ne semble pas être une solution propre pour moi.

glUniform1i(texture1Loc, 0); //Texture unit 0 is for texture1 sampler. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, texture1); 


glUniform1i(texture2Loc, 1); //Texture unit 1 is for texture2 sampler 
glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, texture2); 

.... 

glUniform1i(texture1Loc, 0); //Texture unit 0 is for texture1 sampler. 
glUniform1i(texture2Loc, 0); //Texture unit 0 is for texture2 sampler. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, texture1); 

Y at-il une solution pour cela? Peut-être que la première approche est correcte, mais je fais quelque chose de mal? Est-ce possible de lier une texture à plusieurs unités?

+1

Vous connaissez la section '...' dans votre (fragment?) Shader, où les uniformes sont réellement utilisés, est manquant? Il est difficile de diagnostiquer votre problème sans voir comment les uniformes sont utilisés dans le programme compilé et lié. Cela signifie qu'il est important de montrer le reste du shader, et parce que certains compilateurs GLSL font des choses en deux passes, les autres shaders aussi. Si le compilateur détermine qu'un chemin de code est mort, il commencera à supprimer/remplacer les expressions constantes. –

Répondre

2

La liaison de la même texture à deux unités de texture différentes et l'utilisation des deux unités de texture dans un shader doivent être parfaitement parfaites. Il existe un problème différent dans votre code ou un problème dans l'implémentation OpenGL que vous utilisez.

La seule condition d'erreur quelque peu lié je peux trouver est la suivante, à la page 82 de la spécification OpenGL 3.3, dans la sous-section "validation" de la section "2.11 Vertex Shaders":

Cette erreur est généré par une commande qui transfère des sommets à la GL si: [..] des deux échantillonneurs actifs dans l'objet actuel du programme sont de types différents, mais se rapportent à la même unité d'image de texture, [..]

Mais ce n'est pas ce que vous faites, et je n'ai jamais vu quelque chose de spécifié qui vous empêcherait de lier la même texture à multip unités de texture. Si une telle restriction existait, je m'attendrais à ce qu'elle soit dans la même section que celle citée ci-dessus, et aucune chose de ce genre n'y est spécifiée.

+0

En outre, une telle restriction rendrait inutile l'utilisation d'objets Sampler (même texture, liée en plusieurs unités de texture, chacune avec un échantillonneur différent actif). – peppe

+0

J'ai vérifié les erreurs OpenGL et GLSL - il y a non et cela fonctionne toujours comme décrit. Je ne trouve aucune information sur cet exemple à la fois sur Internet et sur les documents OGL. J'utilise OpenGL 3.3.11672, GLSL 330, avec Radeon 4650m sous Windows 7 x64. – Krzycho

+0

Avez-vous une autre configuration sur laquelle vous pouvez l'essayer? Particulièrement avec un GPU d'un fournisseur différent? –