我的计算着色器中有一个 image2DArray,有 7 个切片。我可以毫无问题地使用函数 imageStore 在其中写入并显示这些纹理。
我的问题与初始化有关,我尝试初始化我的纹理,但我不能。事实上,我为初始化做了一个循环:
for(int i=0; i<N; i++){
imageStore( outputTexture , ivec3(texel, i), vec4(0));
}
当 N = 7 时,不显示任何内容,但当 N < 7 时一切正常并且我的纹理已初始化。
有人可以解释为什么我无法正确初始化我的 image2DArray 吗?
编辑:我测试看到的是:尝试写入纹理的所有切片并显示它。它工作正常,但如果我不初始化纹理,前一帧的数据会保留。因此,我将切片的所有像素初始化为 0,但如果 N=7,则不再显示任何内容。
一些代码:
#version 430 compatibility
layout(rgba8) coherent uniform image2DArray outputTexture;
...
void main(){
ivec2 texel = ivec2(gl_GlobalInvocationID.xy);
ivec2 outSize = imageSize( outputTexture ).xy;
if( texel.x >= outSize.x || texel.y >= outSize.y )
return;
initializeMeshSet( meshSet );
vec4 pWorld = texelFetch(gBuffer[0],texel,0);
pWorld /= pWorld.w;
vec4 nWorld = texelFetch(gBuffer[1],texel,0);
nWorld /= nWorld.w;
if( length(nWorld.xyz) < 0.1 ){
for(int i=0; i<4; i++){
imageStore( outputTexture , ivec3(texel, i), vec4(0));
}
return;
}
if(nbFrame == 0){
float value = treatment(texel, pWorld, nWorld.xyz, outSize.x);
imageStore( outputTexture, ivec3(texel, 0), vec4(vec3(value),1.0));
imageStore( outputTexture, ivec3(texel, 1), vec4(0.0,0.0,0.0, 1.0));
}
else if(nbFrame == 1){
float value = treatment2(texel, pWorld, nWorld.xyz, outSize.x);
vec3 previousValue = imageLoad(outputTexture, ivec3(texel, 1)).xyz * (nbFrame - 1);
value += previousValue;
value /= nbFrame;
imageStore( outputTexture, ivec3(texel, 1), vec4(vec3(value), 1.0));
}
}