2012-06-03 97 views
20

我讀過OpenGL 2.1中的紋理示例。片段着色器看起來是這樣的:sampler2d存儲什麼?

#version 120 

uniform sampler2D texture; 
varying vec2 texcoord; 

void main(void) 
{ 
    gl_FragColor = texture2D(texture, texcoord); 
} 

texcoord從頂點着色器傳遞。

下面的C++代碼渲染使用:

void render() 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 
    glUniform1i(unf_texture, 0); 
} 

我感到困惑的一些事情。我有一些問題:

  1. 在片段着色器,紋理傳遞一個零值(由glUniform1i)。這個值真的是零嗎?其他的價值是什麼?

  2. glActiveTexture電話真的需要嗎?

  3. 爲什麼我們在glUniform1i中傳遞零值?

回答

29

sampler2D綁定到texture unit。 glUniform調用將其綁定到紋理單元零。只有在打算使用多個紋理單元時才需要glActiveTexture調用(因爲GL_TEXTURE0是默認設置)。

+24

你應該習慣於總是調用'glActiveTexture'。這樣,當你突然需要使用多個紋理時,你不會打破世界。 –

+0

來澄清 - 是否正確的是,可以綁定在同一個「GL_TEXTURE0」下的每個紋理(1D,2D,3D)必須具有傳遞給sampler1D/2D/3D的相同值(0)?並且在「GL_TEXTURE1」下分配的紋理將需要將值1傳遞給着色器內部的制服? – Chris

+1

@Chris是的,這是正確的。 –