GLSL纹理sampler2D硬编码

3
在我的片段着色器中,我有以下代码行:
gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;

其中texture是类型为sampler2D的统一变量。在我的代码中,我总是将其设置为值“0”。

glUniform1i(_uniformTexture, 0);

是否可以跳过对glUniform1i的调用,直接在片段着色器中硬编码0?我尝试将texture替换为0,但它抱怨它不是有效的类型。

2个回答

2
你需要一个像这样的布局
#version 420
//#extension GL_ARB_shading_language_420pack: enable  Use for GLSL versions before 420.

layout(binding=0) uniform sampler2D diffuseTex;

以这种方式,您将得到与采样器uniform 0的绑定。我想那就是你想要的。但请记住,当你绑定uniforms时,它们从零开始递增,所以要确保你想绑定的是什么。通过glUniform1i()函数来绑定uniform变量的想法是为了确保您的代码的正确性。
来源:http://www.opengl.org/wiki/GLSL_Sampler#Version_4.20_binding

1

我不确定你想实现什么,但是这是我的一些想法:

sampler2D需要采样一个二维纹理,正如它的名字所示。它是一个特殊的GLSL变量,所以编译器不允许将0作为第一个参数传递给texture2D

除非你使用多个纹理,否则glUniform1i函数的第二个参数应该始终为0(默认值)。如果您只使用单个纹理,则可以跳过此调用,但最好将其保留。

如果你只想传递值0,为什么还需要调用texture2D函数呢?你可以直接使用gl_FragColor = destinationColor。这将根据顶点着色器从gl_Position输出的颜色对你的片元进行着色。如果你不打算使用纹理(或者看起来是这样),那么我不确定为什么你要实现它。

编辑:正确地将两个纹理发送到片元着色器的代码。

//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();

我打算一次只使用一个纹理。将“texture”替换为“0”的原因是_uniformTexture是texture的位置,而在位置_uniformTexture处的值被设置为0(通过调用glUniform1i)。不确定为什么这不更明显。我还尝试将“texture”替换为“(sampler2D)0”,但也没有起作用。 - Mr. Smith
_uniformTexture只是您着色器中sampler2D变量的句柄。当您通过调用glUniform1i发送0时,您实际上只是告诉采样器从哪里采样,给定一个活动和绑定的纹理(请参见上面的代码编辑)。这里的值为0并不意味着“不采样任何东西”,而是表示从阶段索引0进行采样。您的纹理到底用于什么?我没有看到将其设置为0的好处。 - Ricardo RendonCepeda
好像是这样,编码愉快! - Ricardo RendonCepeda
仅供澄清-这意味着GLSL中的sampler2D始终对应于用于绑定纹理的glActiveTexture,而不是纹理句柄(在您的示例中为“_texture1”)。在OpenGL中,您可以使用单个glActiveTexture()同时绑定1D/2D/3D纹理 - 我假设这在GLSL中不被允许/无法工作?(至少我没能使它工作) - Chris
我对OpenGL的经验不是很丰富,所以无法评论API之间的差异。然而,这里的Brad Larson的答案可能是你能找到的最好的解释。我上面的代码摘录遵循相同的风格和推理方式。 - Ricardo RendonCepeda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接