Opengl es 硬编码GLSL纹理采样器2D

Opengl es 硬编码GLSL纹理采样器2D,opengl-es,glsl,Opengl Es,Glsl,在片段着色器中,我有一行 gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor; 其中纹理是类型采样器2D的统一。在我的代码中,我总是将其设置为值“0” glUniform1i(_uniformTexture, 0); 是否可以跳过对glUniform1i的调用,而只调用片段着色器中的核心0?我试着用0替换texture,但它抱怨它不是一个有效的类型。我不完全确定您想要实现什么,但

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

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;
其中
纹理
是类型
采样器2D
的统一。在我的代码中,我总是将其设置为值“0”

glUniform1i(_uniformTexture, 0);

是否可以跳过对
glUniform1i
的调用,而只调用片段着色器中的核心0?我试着用
0
替换
texture
,但它抱怨它不是一个有效的类型。

我不完全确定您想要实现什么,但这里有一些想法:

sampler2D
需要对2D纹理进行采样,如名称所示。它是一个特殊的GLSL变量,因此编译器在输入
texture2D
的第一个参数时抱怨
0
不是有效类型是正确的

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

如果只想传递值0,为什么需要调用texture2D?当然你可以只做
gl\u FragColor=destinationColor
。这将根据
gl\u 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();

您需要一个布局,如下所示:

#version 420
//#extension GL_ARB_shading_language_420pack: enable  Use for GLSL versions before 420.

layout(binding=0) uniform sampler2D diffuseTex;
通过这种方式,您将获得到采样器统一0的绑定。我想这就是你想要的。但请记住,当您绑定制服时,它们从零开始获得增量值,因此请确保要绑定的内容。通过
glUniform1i()
函数绑定统一变量的想法是为了确保代码的正确性


来源:

我打算一次只使用一种纹理。将
纹理
替换为
0
的基本原理是
\u uniformTexture
纹理
的位置,而
\u uniformTexture
位置的值设置为
0
(通过调用
glUniform1i
)。不知道为什么这不是很明显。我还尝试用
(sampler2D)0
替换
纹理
,但同样无效。
\u uniformTexture
只是着色器中
sampler2D
变量的句柄。当您通过调用
glUniform1i
发送
0
时,您实际上只是告诉采样器从何处采样,给定了一个活动的绑定纹理(请参见上面的代码编辑)。这里的值0并不意味着“无样本”,它意味着来自阶段索引0的样本。你的纹理到底是用来做什么的?我看不出将其设置为0有什么好处。似乎是这样,编码快乐!只是为了澄清-这意味着GLSL中的sampler2D始终对应于用于绑定纹理的任何glActiveTexture,而不是纹理句柄(在您的示例中为“_texture1”)。在OpenGL中,您可以在单个glActiveTexture()下同时绑定1D/2D/3D纹理-我想这是不允许的/在GLSL中工作?(至少我不能让它工作)我对OpenGL不是很有经验,所以我不能评论API的差异。但是,这可能是对您最好的解释。我上面的代码摘录遵循相同的风格和推理。