1

我尝试使用图像加载/存储功能。我需要几张图像,如果它们被索引,则编码方便,所以我想使用 image2DArray 统一。但似乎只有 image2DArray 的第一层有效。在换句话说,iimage2DArray 的性能类似于 iimage。

片段着色器(仅由 fs 使用):

#version 420                                                                                                                                                    
coherent uniform layout(r32i) iimage2DArray sigmal;                                                                       
out vec4 FragColor;                                                                                                                                                 
void main()                                                                       
{                                                                               
    ivec2 coord = ivec2(gl_FragCoord.xy);
    int increment=100;
    int v=imageAtomicAdd(sigmal,ivec3(coord,**1**),increment);  //the promlem is that it seems 
                                                            //the coordinate z has no influence
    FragColor =vec4(coord/screenSize,v/1000.0f,1);

}

C++代码:绑定:

glGenTextures(1,&image);
glBindTexture(GL_TEXTURE_2D_ARRAY,image);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB,0);
//Allocate the storage.
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R32I, width, height, layerCount);

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RED_INTEGER, GL_INT, clearData);     //

glBindImageTexture(0, image, 0, GL_TRUE, 0, GL_READ_WRITE, GL_R32I);

//Always set reasonable texture parameters
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

使成为:

glBindTexture(GL_TEXTURE_2D_ARRAY,image);
shader.use();
shader.setUniform("sigmal",0);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
shader.unuse();
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
int *data=new int[viewport[2]*viewport[3]*layerCount];
glBindTexture(GL_TEXTURE_2D_ARRAY,image);
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB,0);
glGetTexImage(GL_TEXTURE_2D_ARRAY, 0 , GL_RED_INTEGER, GL_INT,data );
printf("%d %d\n",data[0],data[viewport[2]*viewport[3]]);

printf 结果是 data[0] ,我认为是第一层的第一个纹素逐帧增加,而我认为是第二层的第一个纹素的 data[viewport[2]*viewport[3]] 没有'不改变。我认为合理的结果是相反的。

4

0 回答 0