我对如何将纹理绑定(bind)到GLSL中的插槽有点困惑。这是我的着色器:

#version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 texCoords;
out vec4 ex_texCoords;

uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;

void main(void)
{
    gl_Position = (ProjectionMatrix * ViewMatrix * ModelMatrix) * in_Position;
    ex_texCoords = texCoords;
}


#version 330

in vec4 ex_texCoords;
out vec4 out_Color;

uniform sampler2D textureSampler;

void main(void)
{
    out_Color = texture(textureSampler2, ex_texCoords.xy);
}

设置矩阵时,我需要查询统一位置,然后手动在该位置设置值,如下所示:
modelMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ModelMatrix");
...
glUniformMatrix4fv(modelMatrixUniformLocation, 1, GL_FALSE, modelMatrix.data);

但是,据我所知,我不需要这样做就可以初始化我的纹理采样器。在设置时,我似乎需要做的就是:
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexImage2D(...);

所以,我的问题是,为什么我不需要对矩阵进行与纹理相同的处理? OpenGL运行时如何“知道”我绑定(bind)的纹理应该是我定义的采样器?如果我想拥有多个纹理,该如何做呢?

最佳答案

OpenGL不知道要使用哪个采样器,必须使用glActiveTexture(GL_TEXTUREi)(其中i0GL_MAX_TEXTURES)手动绑定(bind)它。您的代码有效,因为默认采样器为GL_TEXTURE0。显然,您很幸运,着色器链接器将textureSampler设置为0。

此外,版本3和更高版本的OpenGL API中还有一项新功能-glGenSamplersglBindSampler。它允许您使用与纹理无关的采样器配置!您可以阅读http://www.g-truc.net/post-0267.html以获得更多详细信息。

我建议您从http://www.g-truc.net/project-0026.html下载样本

关于opengl - 绑定(bind)OpenGL纹理采样器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13031977/

10-12 07:39
查看更多