OpenGL 4.2でアトミックテクスチャを使用して、シングルパス深度ピーリングアルゴリズムの実装に取り組んでいます。私は次のフラグメントプログラムを書きました:
#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)
シェーダーで#version420を使用していることに注意してください。ドキュメント( imageLoad、imageStore )で関数の宣言を確認したところ、一致しているようです。不思議なことに、imageAtomicCompSwap、memoryBarrier、およびimageAtomicExchangeが定義されているようです。なぜこれらのエラーが発生する可能性がありますか?