绑定OpenGL纹理采样器

9

我有点困惑如何在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个回答

13

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

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

我建议您下载来自http://www.g-truc.net/project-0026.html的示例。


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

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