硬编码GLSL纹理sampler2D

时间:2012-12-24 13:55:38

标签: opengl-es glsl

在我的片段着色器中,我有一行

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;

其中texturesampler2D类型的制服。在我的代码中,我总是将其设置为值'0'。

glUniform1i(_uniformTexture, 0);

是否可以跳过对glUniform1i的调用,只是片段着色器中的硬核0?我尝试将texture替换为0,并抱怨其不是有效类型。

2 个答案:

答案 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