我有一个计算着色器,我想在其中写入 a 的不同层,GL_TEXTURE_2D_ARRAY
但imageStore
它不起作用。
这是我用来初始化纹理的代码:
void Manager::initTextures(){
texId = 0;
GLsizei width = ofGetWidth();
GLsizei height = ofGetHeight();
GLsizei layerCount = NB_TEX;
GLsizei mipLevelCount = 1;
GLfloat texels[width*height*4*NB_TEX];
for(int i = 0; i < width*height*4*NB_TEX; ++i){
texels[i] = 1.0;
}
glGenTextures(1,&texId);
glBindTexture(GL_TEXTURE_2D_ARRAY,texId);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA32F, width, height, layerCount);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_FLOAT, texels);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
}
计算着色器调用(在每一帧调用):
void Manager::update(){
cs.begin();
glBindImageTexture(0, texId, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
glUniform1i(cs.getUniformLocation("pathTex"), 0);
cs.dispatchCompute(NB_TEX, 1, 1);
glMemoryBarrier(GL_ALL_BARRIER_BITS);
cs.end();
}
计算着色器:
#version 430
layout(rgba32f, binding=0) uniform coherent restrict image2DArray pathTex;
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main(){
imageStore(pathTex, ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 1.0));
}
计算着色器似乎没有做任何事情。但是,我可以在片段着色器中访问纹理的所有层。