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?
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. –