OpenGL清除多重3D纹理

OpenGL清除多重3D纹理,opengl,Opengl,我有4个3D纹理,我正在使用imageStore在一次调用中对它们进行书写,一切正常。唯一的问题是如何在每个帧中清除它们。这就是我创建它们的方式 for (int i = 0; i < MIPLEVELS; ++i){ glGenTextures(1, &volumeTexture[i]); glBindTexture(GL_TEXTURE_3D, volumeTexture[i]); glTexImage3D(GL_TEXTURE_3D, 0, GL_R

我有4个3D纹理,我正在使用imageStore在一次调用中对它们进行书写,一切正常。唯一的问题是如何在每个帧中清除它们。这就是我创建它们的方式

 for (int i = 0; i < MIPLEVELS; ++i){
    glGenTextures(1, &volumeTexture[i]);
    glBindTexture(GL_TEXTURE_3D, volumeTexture[i]);
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, volumeDimensions / (1 << i), volumeDimensions / (1 << i), volumeDimensions / (1 << i), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
    glBindTexture(GL_TEXTURE_3D, 0);
    glGenFramebuffers(1, &volumeFbo[i]);
    glBindFramebuffer(GL_FRAMEBUFFER, volumeFbo[i]);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, volumeTexture[i], 0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

for (int i = 0; i < MIPLEVELS; ++i){
    glBindFramebuffer(GL_FRAMEBUFFER, volumeFbo[i]);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
}

但是什么也没发生。

我认为有两种方法可以解决这个问题

您可以执行循环,将每个纹理作为GL_COLOR_ATTACHMENT0附加,然后清除每个纹理

否则,也可以使用glClearBuffer纹理族:

您所有的纹理大小都一样吗?否则,如果同时附加所有4个帧缓冲区,则不会有有效的帧缓冲区。FBO的所有附件必须具有相同的大小。它们具有相同的大小
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

for (int i = 0; i < MIPLEVELS; ++i){
    glBindFramebuffer(GL_FRAMEBUFFER, volumeFbo[i]);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, volumeFbo[0]);
    GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
    glDrawBuffers(4, buffers);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);