OpenGL清除多个3D纹理

时间:2014-07-28 11:04:35

标签: 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_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);
}

这就是我每个帧清除它们的方法

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);

正如您所看到的,我正在使用4种不同的FBO,这是一个很大的浪费。我尝试使用4个目标,但它们没有被清除。我是这样做的: 我绑定了一个FBO并使用glFrameBufferTexture3D创建了4个目标,然后我调用了每个帧

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);

但什么都没发生。

1 个答案:

答案 0 :(得分:1)

我相信有两种方法可以解决这个问题。

您可以执行循环,将每个纹理附加为GL_COLOR_ATTACHMENT0并清除每个纹理。

否则,您还可以使用glClearBuffer纹理系列: https://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml