2012-12-24 109 views
1

在我的片段着色器,我也行硬編碼GLSL紋理sampler2D

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor; 

哪裏texturesampler2D型的統一。在我的代碼中,我總是將它設置爲值'0'。

glUniform1i(_uniformTexture, 0); 

是否有可能跳過在片段着色器調用glUniform1i,只是鐵桿0?我試着用0代替texture,它抱怨說不是有效的類型。

回答

1

我不能完全確定你想要達到的,但這裏有一些想法:

sampler2D需求來樣2D紋理,顧名思義。它是一種特殊GLSL變量,所以編譯器是正確的抱怨0當送入的texture2D第一參數不是有效的類型。

除非您使用多個紋理,否則glUniform1i的第二個參數應始終爲0(默認值)。你可以,如果你只使用一個紋理跳過此呼叫,但它是很好的做法,把它進來

爲什麼你需要的Texture2D一個電話,如果你只是想傳遞0值?當然你可以做gl_FragColor = destinationColor。這會根據gl_Position的頂點着色器輸出爲您的片段着色。我不確定爲什麼你要實現一個紋理,如果你不打算使用它(或者看起來如此)。

編輯:代碼正確發送兩個紋理片段着色器。

//glClear(); 

// Attach Texture 0 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, _texture0); 
glUniform1i(_uSampler0, 0); 

// Attach Texture 1 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, _texture1); 
glUniform1i(_uSampler1, 1); 

//glDrawArrays(); 
+0

我打算一次只使用一個紋理。後面用'0'替換'texture'的理由是,'_uniformTexture'是texture'的'的位置,和該位置的值'_uniformTexture'被置'0'(通過調用'glUniform1i')。不知道爲什麼這不是更明顯。 我也嘗試用'(sampler2D)0'替換'紋理',這也不起作用。 –

+0

'_uniformTexture'只是您着色器中'sampler2D'變量的句柄。當你通過調用'glUniform1i'發送'0'時,你真的只是告訴採樣器從哪裏採樣,給定一個活動和綁定紋理(見上面的代碼編輯)。 0這裏的值並不意味着「什麼樣」,這意味着從第一階段指數0 樣品被用於究竟什麼你的紋理?我沒有看到將它設置爲0的好處。 –

+0

猜猜我可以跳過它。 –

1

你需要一個佈局,像這樣:

#version 420 
//#extension GL_ARB_shading_language_420pack: enable Use for GLSL versions before 420. 

layout(binding=0) uniform sampler2D diffuseTex; 

這樣,你就得到一個綁定到採樣統一0。我認爲那就是你想要的。但請記住,當你綁定製服時,他們從零開始獲得增量值,因此請確定你想要綁定什麼。通過glUniform1i()函數綁定統一變量的想法是確保代碼的正確性。

來源:http://www.opengl.org/wiki/GLSL_Sampler#Version_4.20_binding