我试图弄清楚如何使用 GLSL 4.10 版进行纹理映射。我对 GLSL 很陌生,很高兴今天得到一个三角形渲染,使用着色器根据 sin(time) 褪色。现在我对使用具有单一纹理的着色器很感兴趣。
许多教程甚至 Stack Overflow 的答案都建议使用 gl_MultiTexCoord0。但是,自 GLSL 1.30 以来,这已被弃用,最新版本现在是 4.20。我的显卡不支持 4.20,这就是我尝试使用 4.10 的原因。
我知道我正在适当地生成和绑定我的纹理,并且我有正确的顶点坐标和纹理坐标,因为当我使用固定功能管道时我的高度图渲染得很好,并且它用颜色而不是纹理渲染得很好。
这是我的 GLSL 着色器和一些 C++ 绘制代码:
---heightmap.vert (GLSL)---
in vec3 position;
in vec2 texcoord;
out vec2 p_texcoord;
uniform mat4 projection;
uniform mat4 modelview;
void main(void)
{
gl_Position = projection * modelview * vec4(position, 1.0);
p_texcoord = texcoord;
}
---heightmap.frag (GLSL)---
in vec2 p_texcoord;
out vec4 color;
uniform sampler2D texture;
void main(void)
{
color = texture2D(texture, p_texcoord);
}
---Heightmap::Draw() (C++)---
// Bind Shader
// Bind VBO + IBO
// Enable Vertex and Texcoord client state
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
// glVertexPointer(...)
// glTexCoordPointer(...)
glUniform4fv(projLoc, projection);
glUniform4fv(modelviewLoc, modelview);
glUniform1i(textureId, 0);
// glDrawElements(...)
// glDisable/unbind everything
我还怀疑的事情是我是否必须将纹理坐标的东西作为变量传递给片段着色器,因为我没有在顶点着色器中触摸它。另外,我不知道如何从中获得插值的 texcoords。似乎它只会得到 0.f 或 1.f,而不是插值坐标。我对着色器知之甚少,无法理解它是如何工作的。如果有人能启发我,我会很激动!
编辑1:
@Bahbar:很抱歉,这是一个错字。我在一台机器上输入代码,同时从另一台机器上读取代码。就像我说的,这一切都适用于固定功能管道。虽然 glEnableClientState 和 gl[Vertex|TexCoord]Pointer 已被弃用,但它们仍应与着色器一起使用,不是吗?glVertexPointer 而不是 glVertexAttribPointer 使用颜色而不是纹理。另外,我正在使用 glBindAttribLocation(位置为 0,texcoord 为 1)。
我仍在使用 glVertexPointer 的原因是我试图一次取消弃用一件事。