我想弄清楚如何使用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做同樣的事情,所以我今晚會切換並接受它是否有效。謝謝! :) –