2013-03-07 36 views
2

在我的程序中,我使用了2種紋理:t0和t1。 T1是額外的,只是在某些情況下需要:在OpenGL中綁定零紋理

..... 
glActiveTexture (GL_TEXTURE1); 
if (mDisplayMode == EDM_DEFAULT){ 
    glBindTexture(GL_TEXTURE_2D, 0); // In this case I don't need t1 
}else{ 
    glBindTexture(GL_TEXTURE_2D, mglDegreeTexture); // In this case t1 will overlap t0 
} 
shader->setUniformValue("textureId1", 1); 

着色繪圖:

..... 
vec4 c1 = texture(textureId0, uv); 
vec4 c2 = texture(textureId1, gridUV); 
float a = c2.a; 
gl_FragColor = (1.0 - a)*c1 + a*c2; 

它的正常工作:在需要的時候第二個紋理重疊第一。假設使用glBindTexture(..,0)返回零紋理(0,0,0,0),但在將NVidia驅動程序更新到314.07後,我的代碼產生黑屏,如glBindTexture(..,0)return(0,0 ,0,1)紋理。

我進行了一些測試: 的Shader

.... 
vec4 c1 = texture(textureId0, uv); 
vec4 c2 = texture(textureId1, gridUV); 
float a = c2.a; 
if (a == 1){ 
    gl_FragColor = vec4(1,0,0,0); 
    return; 
} 
if (a == 0){ 
    gl_FragColor = vec4(0,1,0,0); 
    return; 
} 
gl_FragColor = (1.0 - a)*c1 + a*c2; 

我得到老司機(296,306),以及紅,綠,屏幕上一個新的。我使用Win 7(GeForce 210)和Win XP(GTX 260)在兩臺電腦上測試了它。

所以我的問題是:使用glBindTexture 0作爲第二個參數是正確的,我怎樣才能用一個新的驅動程序實現相同的結果(0000紋理)?

回答

6

以下所有內容都涉及核心配置文件3.2,但通常適用於所有版本的GL。

名稱0對應於默認紋理對象(每個紋理目標一個:1d,2d,...見3.8.14,最後一段)。

所以glBindtexture(2D, 0);讓你獲得默認的紋理對象。它確實是而不是意味着禁用紋理。現在,默認對象的紋理會導致通常的操作,只是在您自己沒有創建的紋理對象上。最初的紋理對象最初是不完整的,所以除非你修改它,否則它將遵循「不完整」的規則。

現在規範說(3.9.2,紋理訪問段落),從不完整紋理抽樣將返回(0,0,0,1)。

所以你的老司機沒有按照規範行事。

+0

太棒了!這是合乎邏輯的使用(0,0,0,0)作爲「零」紋理;(我沒有找到有什麼辦法來定義默認紋理? – Jeka 2013-03-07 16:06:50

+1

@Jeka:這是一個像任何其他紋理,所以如果你設置它爲1x1 RGBA紋理,其內容爲0,0,0,0的單一紋素,它將完成你以後的工作,通常這樣使用它,所以你可能會混淆任何人閱讀你的代碼(哦,並可能發現更多驅動程序錯誤) – Bahbar 2013-03-07 16:12:13

+0

看起來很有趣;)1x1 RGBA紋理是我當前的解決方案,但我不嘗試將它與0綁定 – Jeka 2013-03-11 07:57:43