2013-04-12 60 views
0

我在執行下面的片段着色器得到一個錯誤:的OpenGL紋理查找錯誤

#version 430 core 

in vec4 pos;   // <-- input (x,y,z) position normalized to [0, 1] 
in vec4 screenPos;  // <-- input screen position normalized to [-1, 1] 
out vec4 outColor; 

uniform sampler3D volumeTex; // <-- a volume 
uniform sampler2D backFaceTex; // <-- the backface of a cube previously saved to texture 

void main() 
{ 
    if(gl_FrontFacing) { 
     vec4 front = pos; 
     vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0); 

     // only one of the following 4 lines is uncommented at a time 
     outColor = front;       // <-- Ok 
     outColor = back;       // <-- Ok 
     outColor = texture(volumeTex, front.xyz); // <-- Ok 
     outColor = texture(volumeTex, back.xyz); // <-- Error 
    } 
    else { 
     discard; 
    } 
} 

你可以從我的意見讀取程序運行正常,使我想到了圖像,在前三種情況下,但在第四個失敗(我需要的唯一一個)。

沒有呈現,我在主應用程序得到一個錯誤,從glGetError()。

好像是禁止使用紋理像素的座標另一紋理參數讀取操作。

誰能告訴我問題出在哪裏?

+0

什麼是'glGetError()'和上調用它發生了錯誤?着色器編譯器日誌說什麼? – user1118321

回答

0

三江源derhass,

我發現那裏的問題是: 我用的是相同的紋理單元同時爲3D和2D採樣,這是非法的。 保持代碼原樣,並簡單地使用紋理單元0作爲sampler3D和紋理單元1作爲sampler2D,例如,解決了問題!

乾杯, 馬西莫

0

使用一個紋理的結果取爲另一個紋理拾取座標被稱爲依賴紋理獲取,是完全有效的(儘管它可能有比較獨立的fecth對性能產生一定負面影響)。

在你的代碼的問題是最有可能的

vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0); 

線,在那裏你基本上有一個(VEC 2(...)+ 1.0)工作,其只是不允許的,應導致編譯錯誤。這也可以解釋這樣一個事實,即沒有繪製任何東西,並且在試圖繪製時會出錯(沒有有效的程序)。