2

在我的片段着色器中,我有这条线

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;

哪里texture是制服的类型sampler2D。在我的代码中,我总是将其设置为值“0”。

glUniform1i(_uniformTexture, 0);

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

4

2 回答 2

2

我不完全确定您要达到的目标,但这里有一些想法:

sampler2D顾名思义,需要对 2D 纹理进行采样。它是一个特殊的 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();
于 2012-12-24T14:48:07.333 回答
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

于 2013-09-05T15:14:52.090 回答