我想弄清楚如何使用GLSL 4.10版进行纹理映射。我对GLSL相当陌生,很高兴今天能够获得三角形渲染,使用着色器基于颜色逐渐消失(时间)。现在我对使用具有单个纹理的着色器感兴趣。GLSL 4.10纹理映射
很多教程,甚至堆栈溢出答案建议使用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]指针已弃用,但它们仍应与着色器一起工作,否? glVertexPointer而不是glVertexAttribPointer使用颜色而不是纹理。此外,我使用glBindAttribLocation(位置为0,texcoord为1)。
我仍然在使用glVertexPointer的原因是我试图一次不要弃用一件东西。
请参阅我的编辑以回应您的答案。 –
我一直在网上做一些阅读,看起来你肯定是对的,TexCoordPointer不一定和VertexAttribPointer做同样的事情,所以我今晚会切换并接受它是否有效。谢谢! :) –