2011-11-29 137 views
2

我想弄清楚如何使用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的原因是我试图一次不要弃用一件东西。

回答

3

glBindTexture将纹理对象作为第二个参数。

// Enable Vertex and Texcoord client state 

我假设你的意思是通用顶点属性?你的positiontexcoord属性在哪里设置?为此,需要对glEnableVertexAttrib和glVertexAttribPointer进行一些调用,而不是glEnableClientState和glVertex/TexCoordPointer(所有这些都以与gl_MultiTexCoord在glsl中相同的方式弃用)。你需要调用glGetAttribLocation来找出GL选择放置attrib的位置,或者用glBindAttribLocation自己定义它(在连接程序之前)。然后,为了找出绑定属性的位置,你需要调用glGetAttribLocation来找出放置attrib的位置。

编辑加入,您加入后:

嗯,0可能最终从glVertexPointer拉的数据(你不应该依赖的原因ATTRIB 0是特殊的,最IHVs使其工作就像顶点),但1很可能不会从glTexCoord中提取数据。在理论上,通用属性(如texcoord,从glVertexAttribPointer(1,XXX)获取其数据,这里是您选择的位置)和内置属性(如gl_MultiTexCoord [ 0]从glTexCoordPointer获取其数据)。

现在,已知nvidia不遵循规范,并确实是别名属性(据我所知,这来自Cg模型),并且还会说为glTexCoord使用特定的属性位置( Cg spec建议它使用TexCoord0的位置8 - 位置1是属性混合权重 - 请参阅表39,p242),但实际上应该咬住子弹并将TexCoordPointer切换到VertexAttribPointer调用。

+0

请参阅我的编辑以回应您的答案。 –

+0

我一直在网上做一些阅读,看起来你肯定是对的,TexCoordPointer不一定和VertexAttribPointer做同样的事情,所以我今晚会切换并接受它是否有效。谢谢! :) –