绑定 OpenGL 纹理采样器

Posted

技术标签:

【中文标题】绑定 OpenGL 纹理采样器【英文标题】:Binding an OpenGL Texture Sampler 【发布时间】:2012-10-23 13:49:10 【问题描述】:

我对如何将纹理绑定到 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 运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多个纹理,我该怎么做?

【问题讨论】:

【参考方案1】:

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

此外,OpenGL API 版本 3 及更高版本中还有一项新功能 - glGenSamplers、glBindSampler。它允许您使用与纹理无关的采样器配置!你可以阅读http://www.g-truc.net/post-0267.html了解更多详情。

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

【讨论】:

好的,这更有意义。所以,我可以有多个采样器,使用 gl*Samplers 功能创建,但一次只有一个活动纹理? @anjruu 你可以,但这是反向问题的解决方案 - 一个采样器和多个纹理。因为您可以配置一次采样器并在任何地方使用它,您不再需要配置每个纹理,只需配置几个基本的采样器即可。

以上是关于绑定 OpenGL 纹理采样器的主要内容,如果未能解决你的问题,请参考以下文章

帧缓冲区和在opengl中使用着色器

opengl中纹理单元和采样器制服之间的对应关系

OpenGL均匀采样器2D具有相同的图像

OpenGL4 多重采样抗锯齿和渲染到纹理

将一个纹理绑定到两个不同的统一采样器

没有纹理图像单元的 Opengl 纹理