2015-02-09 65 views
3

OpenGL標準是否規定應該給紋理2d操作的結果提供一個統一的sampler2D,程序沒有綁定到紋理單元?從未綁定的紋理單元讀取OpenGL

例如在像素着色器:

layout(binding=0) uniform sampler2D Map_Diffuse; 
... 
texture2D(Map_Diffuse, attrib_Fragment_Texture) 

凡在節目:

::glActiveTexture(GL_TEXTURE0); 
::glBindTexture(GL_TEXTURE_2D, 0); 

對於方面,我想知道我是否可以使用相同的着色器的紋理和無紋理實體(希望)我只需要確保沒有任何東西綁定到GL_TEXTURE_2D爲texture2d()返回0,0,0,1。否則,我將需要一個着色器爲每個排列。

+0

[在OpenGL中綁定零紋理](http://stackoverflow.com/questions/15273674/binding-a-zero-texture-in-opengl) – Bahbar 2015-02-09 15:59:41

+0

是的。感謝那。回答了我的問題! – Robinson 2015-02-09 16:15:28

回答

2

我閱讀規範的方式,它保證返回黑色。以下引號是從3.3規範複製的。

在根據 「頂點着色器」 部分2.11.7 「着色器執行」,81頁:

在頂點或幾何着色器使用採樣器將返回(R,G,B,A)= (0,0,0,1),如果採樣器的相關紋理不完整,如3.8.14節所定義。

和等同於下 「片段着色器」 部分3.9.2 「着色器執行」,188頁上:

在片段着色器使用採樣器將返回(R,G,B,A )=(0,0,0,1)如果採樣器的關聯紋理不完整,如3.8.14節定義。

在第3.8.14「紋理完整性」,它說:

紋理被認爲是完整的,如果需要利用紋理應用紋理所有的圖像陣列和紋理參數的一致性德網絡定義。

現在,它沒有明確地說出任何關於甚至不存在的紋理對象。但是因爲沒有引用紋理對象(包括0)的紋理名稱當然沒有「所有圖像數組和紋理參數一致定義」,所以我認爲它們屬於上面定義中的「不完整」。

+0

謝謝Reto。 – Robinson 2015-02-10 10:42:30

1

是否OpenGL標準的任務是什麼一個Texture2D 操作的結果應該給一個統一的sampler2D,該方案還沒有 綁定到紋理單元?

當紋理採樣器未綁定到紋理對象時,它默認綁定到紋理對象0/null,這在C/C++中是空的。當訪問對象null,從我的經驗,你得到的零個值。例如:

vec2 Data = texture(unboundSampler, textureCoords); 

Data往往會zoroes,但我的假設是這個實現依賴,一些司機可能會崩潰。

對於方面,我想知道我是否可以使用相同的着色器 紋理和無紋理實體

在我的引擎我通過創建一個默認的白色紋理是4個白色像素解決了這個。在引擎初始化時由代碼生成。當我想使用具有紋理採樣器的着色器並且相應的材質沒有紋理時,我指定默認的白色紋理。這樣我可以重複使用相同的着色器。如果你非常關心性能,你可能想使用沒有紋理的着色器處理非紋理對象。

standard doesn't talk about the implementation但它鼓勵您將零對象視爲非功能對象。 https://www.opengl.org/wiki/OpenGL_Object#Object_zero

+0

這是一個好主意,但如果他們嘗試做某些他們不應該做的事情,我通常更喜歡事情崩潰。我討厭它,因爲驅動程序和庫對錯誤的輸入有影響。他們不會給程序員任何好處。你懂我的意思嗎?我仍然想知道標準是否說明了這一點。 – Robinson 2015-02-09 15:16:05

+0

@Robinson編輯答案澄清。 – concept3d 2015-02-09 17:19:45