2012-07-01 55 views
0

我正在使用OpenGL 4.2中的原子紋理來實現單遍深度剝離算法。我寫了下面的片段程序:imageLoad和imageStore看似沒有定義

#version 420 core 
layout(r32i) coherent uniform iimage2D img2D_0; 
uniform iimage2D img2D_1; 
in vec3 pos; 
vec4 insert(vec4 data, float new_data) { 
    if  (new_data<data.x) return vec4(  new_data,data.xyz); 
    else if (new_data<data.y) return vec4(data.x,new_data,data.yz); 
    else if (new_data<data.z) return vec4(data.xy,new_data,data.z); 
    else if (new_data<data.w) return vec4(data.xyz,new_data  ); 
    else      return data; 
} 
void main() { 
    ivec2 coord = ivec2(gl_FragCoord.xy); 
    while (imageAtomicCompSwap(img2D_0,coord,0,1)==1); 
    vec4 depths = imageLoad(img2D_1,coord); 
    depths = insert(depths,gl_FragCoord.z); 
    imageStore(img2D_1,coord,depths); 
    memoryBarrier(); 
    imageAtomicExchange(img2D_0,coord,0); 
} 

不過,我得到以下錯誤:

Fragment info 
------------- 
0(15) : error C1115: unable to find compatible overloaded function "imageLoad(struct iimage2D, ivec2)" 
0(17) : error C1115: unable to find compatible overloaded function "imageStore(struct iimage2D, ivec2, vec4) 

我注意,我用的#Version 420在着色器,和我檢查功能的聲明中文檔(imageLoad,imageStore)和他們似乎匹配。奇怪的是,imageAtomicCompSwap,memoryBarrier和imageAtomicExchange似乎被定義。爲什麼會出現這些錯誤?

回答

1
uniform iimage2D img2D_1; 

這不是一個有效的圖像定義。您必須必須使用layout()來定義其圖像格式,除非您已聲明writeonly。它應該在這一行上出現錯誤,但它將它解釋爲某種結構定義。所以當你嘗試使用它時,它會出錯。

+0

謝謝;我將它改爲「layout(RGBA32F)uniform image2D」並編譯。 – imallett

+0

@IanMallett:順便說一句,您可能希望將錯誤作爲驅動程序錯誤提交給NVIDIA或AMD。他們應該清理錯誤信息更加明顯。 –

+0

已經有;-)感謝您的幫助, – imallett