我对如何将纹理绑定到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);
}
Run Code Online (Sandbox Code Playgroud)
当我设置矩阵时,我需要查询统一位置,然后在该位置手动设置值,执行以下操作:
modelMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ModelMatrix");
...
glUniformMatrix4fv(modelMatrixUniformLocation, 1, GL_FALSE, modelMatrix.data);
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,我不需要这样做来初始化我的纹理采样器.在设置时,我似乎需要做的就是:
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexImage2D(...);
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,为什么我不需要为矩阵做我需要做的纹理处理呢?OpenGL运行时如何"知道"我绑定的纹理应该是我定义的采样器?如果我想要多个纹理,我该怎么做呢?
glc*_*der 10
OpenGL不知道要使用哪个采样器,你必须使用glActiveTexture(GL_TEXTUREi)
(i
从哪里)0
来手动绑定它GL_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下载样本