2016-08-14 36 views
0

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

你知道在你的(片段?)着色器中实际使用制服的那部分“......”是否丢失?没有看到编译和链接程序中如何使用制服,很难诊断问题。这意味着显示着色器的其余部分是非常重要的,并且由于一些GLSL编译器以两遍,其他着色器阶段来执行。如果编译器确定某个代码路径死了,它将开始删除/替换常量表达式。 –

回答

2

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

唯一有点相关的错误情况我能找到的是下面了OpenGL 3.3规范的第82页上,在小节“验证”第“2.11顶点着色器”:

此错误由传送顶点到GL任何命令生成,如果:[..]在当前程序对象中的任何两个有源采样是不同类型的,但是指相同的纹理图像单元,[..]

但是这不是你正在做的,我从来没有看到任何指定的东西可以阻止你绑定相同的纹理来乘法le纹理单位。如果存在这样的限制,我希望它与上面引用的部分在同一部分,并且在那里没有指定这样的限制。

+0

此外,这样的限制会使得采样器对象的使用变得毫无意义(相同的纹理,以多个纹理单元绑定,每个纹理单元采用不同的采样器激活)。 – peppe

+0

我检查了OpenGL和GLSL错误 - 有没有,它仍然如上所述的工作。我无法在互联网和OGL文档上找到有关此示例的任何信息。我在Windows 7 x64上使用OpenGL 3.3.11672,GLSL 330和Radeon 4650m。 – Krzycho

+0

你有另一种配置可以试试吗?特别是来自不同供应商的GPU? –

相关问题