将一个纹理绑定到两个不同的均匀采样器

时间:2016-08-14 20:25:20

标签: opengl glsl opengl-3

是否可以将一个纹理绑定到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);

有没有解决方法呢?也许第一种方法是正确的,但我做错了什么?是否可以将一个纹理绑定到多个单位?

1 个答案:

答案 0 :(得分:2)

将相同的纹理绑定到两个不同的纹理单元,并在着色器中使用两个纹理单元,应该非常精细。您的代码中存在不同的问题,或者您正在使用的OpenGL实现中存在问题。

我能找到的唯一有点相关的错误条件如下,在OpenGL 3.3规范的第82页,在子部分"验证"在" 2.11顶点着色器":

  

如果以下情况,任何将顶点传输到GL的命令都会生成此错误:[..]当前程序对象中的任何两个活动采样器的类型不同,但引用相同的纹理图像单元,[..] < / p>

但那不是你正在做的事情,而且我从来没有看到任何指定会阻止你将相同纹理绑定到多个纹理单元的东西。如果存在这样的限制,我希望它与上面引用的部分在同一部分,并且那里没有指定。