是否可以将一个纹理绑定到openGL中的两个(或更多)不同的统一采样器? 当两个不同的纹理渲染它是这样的:将一个纹理绑定到两个不同的统一采样器
着色器:
uniform sampler2D texture1;
uniform sampler2D texture2;
....
客户:
//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*();
但是,当我尝试一个纹理对象绑定到两个不同的纹理单元,它似乎是先绑定的单元保持未绑定:
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
当然,可以为两个采样器设置相同的单位,但有时我也想使用我的着色器处理不同的纹理 - 不仅要将同一纹理对象设置为两个采样器。
glUniform1i(texture1Loc, 0); //Texture unit 0 is for texture1 sampler.
glUniform1i(texture2Loc, 0); //Texture unit 0 is for texture2 sampler (thesame unit).
该解决方案实际上工作得很好,但它不符合我所描述的需求。 也可以在绑定之前更改采样器的纹理单元,但它似乎不是一个干净的解决方案。
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);
有没有解决方案?也许第一种方法是正确的,但我做错了什么?是否有可能将一个纹理绑定到许多单元?
你知道在你的(片段?)着色器中实际使用制服的那部分“......”是否丢失?没有看到编译和链接程序中如何使用制服,很难诊断问题。这意味着显示着色器的其余部分是非常重要的,并且由于一些GLSL编译器以两遍,其他着色器阶段来执行。如果编译器确定某个代码路径死了,它将开始删除/替换常量表达式。 –