2011-11-29 278 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做同樣的事情,所以我今晚會切換並接受它是否有效。謝謝! :) –