Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 将一个纹理绑定到两个不同的均匀采样器_Opengl_Glsl_Opengl 3 - Fatal编程技术网

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

Opengl 将一个纹理绑定到两个不同的均匀采样器,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,在openGL中可以将一个纹理绑定到两个(或多个)不同的统一采样器吗? 使用两种不同的纹理进行渲染时,如下所示: 着色器: uniform sampler2D texture1; uniform sampler2D texture2; .... 客户: //Initial shader program setup. glLinkProgram(program); GLuint texture1Loc = glGetUniformLocation(program, "texture1"); G

在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);

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

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

在OpenGL 3.3规范第82页的“2.11顶点着色器”小节下的“验证”小节中,我能找到的唯一相关错误条件如下所示:

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


但这不是你正在做的,我从来没有见过任何特定的东西会阻止你将同一个纹理绑定到多个纹理单元。如果存在这样的限制,我希望它与上面引用的部分在同一节中,并且没有指定这样的内容。

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

在OpenGL 3.3规范第82页的“2.11顶点着色器”小节下的“验证”小节中,我能找到的唯一相关错误条件如下所示:

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


但这不是你正在做的,我从来没有见过任何特定的东西会阻止你将同一个纹理绑定到多个纹理单元。如果存在这样的限制,我希望它与上面引用的部分在同一节中,并且没有指定这样的内容。

此外,这样的限制将使采样器对象的使用毫无意义(相同的纹理,绑定在多个纹理单元中,每个单元都有不同的采样器处于活动状态).我已经检查了OpenGL和GLSL错误-没有错误,它仍然按照描述工作。我在互联网和OGL文档上都找不到关于这个例子的任何信息。我正在使用OpenGL 3.3.11672、GLSL 330和Windows 7 x64上的Radeon 4650m。您有其他配置可以试用吗?特别是对于来自不同供应商的GPU?@Krzycho:包括在绘制任何东西之前调用(几乎未知)
glValidateProgram
函数(即,使用所有状态集),然后检查验证状态和信息日志?@peppe:thnks以获取帮助,是的-
glValidateProgram
让我的验证成功了。而且,这样的限制会使采样器对象的使用毫无意义(相同的纹理,绑定在多个纹理单元中,每个纹理单元都有一个不同的采样器处于活动状态)。我已经检查了OpenGL和GLSL错误-没有错误,它仍然按照描述工作。我在互联网和OGL文档上都找不到关于这个例子的任何信息。我正在使用OpenGL 3.3.11672、GLSL 330和Windows 7 x64上的Radeon 4650m。您有其他配置可以试用吗?特别是对于来自不同供应商的GPU?@Krzycho:包括在绘制任何东西之前调用(几乎未知)
glValidateProgram
函数(即,使用所有状态集),然后检查验证状态和信息日志?@peppe:thnks以获取帮助,是的-
glValidateProgram
让我
验证成功
。你知道(片段?)着色器中实际使用制服的部分
丢失了吗?如果不了解制服在编译和链接程序中的使用情况,就很难诊断您的问题。这意味着显示着色器的其余部分实际上很重要,因为一些GLSL编译器在两个过程中执行操作,其他着色器阶段也会执行。如果编译器以某种方式确定代码路径已失效,它将开始删除/替换常量表达式。您知道(片段?)着色器中的
部分丢失了吗?如果不了解制服在编译和链接程序中的使用情况,就很难诊断您的问题。这意味着显示着色器的其余部分实际上很重要,因为一些GLSL编译器在两个过程中执行操作,其他着色器阶段也会执行。如果编译器以某种方式确定一个代码路径是死的,它将开始删除/替换常量表达式。