在我的片段着色器中,我有一行
gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;
其中texture
是sampler2D
类型的制服。在我的代码中,我总是将其设置为值'0'。
glUniform1i(_uniformTexture, 0);
是否可以跳过对glUniform1i
的调用,只是片段着色器中的硬核0?我尝试将texture
替换为0
,并抱怨其不是有效类型。
答案 0 :(得分:1)
我不完全确定你想要达到的目标,但这里有一些想法:
sampler2D
需要对2D纹理进行采样,如名称所示。它是一个特殊的GLSL变量,因此编译器在输入0
的第一个参数时抱怨texture2D
不是有效类型是正确的。
除非您使用多个纹理,否则glUniform1i
的第二个参数应始终为0
(默认值)。如果您只使用单个纹理,则可以跳过此调用,但最好将其保留。
如果你只想传递值0,为什么需要调用texture2D?当然你可以做gl_FragColor = destinationColor
。这将根据gl_Position
的顶点着色器输出为片段着色。如果您不打算使用纹理,我不确定为什么要实现纹理(或者看起来如此)。
EDIT:用于正确地将两个纹理发送到片段着色器的代码。
//glClear();
// Attach Texture 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _texture0);
glUniform1i(_uSampler0, 0);
// Attach Texture 1
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _texture1);
glUniform1i(_uSampler1, 1);
//glDrawArrays();
答案 1 :(得分:1)
您需要布局,如下所示:
#version 420
//#extension GL_ARB_shading_language_420pack: enable Use for GLSL versions before 420.
layout(binding=0) uniform sampler2D diffuseTex;
通过这种方式,您将获得与采样器制服0 的绑定。我想这就是你想要的。但请记住,当您绑定制服时,它们会从零开始增加值,因此请确保要绑定的内容。通过glUniform1i()
函数绑定统一变量的想法是确保代码的正确性。
来源:http://www.opengl.org/wiki/GLSL_Sampler#Version_4.20_binding