简体   繁体   English

OpenGL清除多个3D纹理

[英]OpenGL Clear multiple 3D texture

I have 4 3D textures and I am writing on them using imageStore in a single call, everything works fine. 我有4个3D纹理,并且在一次调用中使用imageStore在它们上书写,一切正常。 The only problem is how I clear them in each frame. 唯一的问题是如何在每个帧中清除它们。 This is how I create them 这就是我创造它们的方式

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

and this is what I do to clear them each frame 这就是我要做的每一帧清除它们

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

As you can see I am using 4 different FBOs which is a big waste. 如您所见,我正在使用4个不同的FBO,这是一个很大的浪费。 I tried using 4 targets but they don't get cleared. 我尝试使用4个目标,但没有清除。 I did it this way: I binded a single FBO and created 4 targets using glFrameBufferTexture3D and then each frame I called 我是这样做的:我绑定了一个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);

But nothing happened. 但是什么也没发生。

I believe there are two ways of solving this issue. 我相信有两种方法可以解决此问题。

You either do a loop where you attach each texture as GL_COLOR_ATTACHMENT0 and clear each texture. 您可以执行循环,将每个纹理附加为GL_COLOR_ATTACHMENT0并清除每个纹理。

Otherwise, you can also use the glClearBuffer family of textures: https://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml 否则,您也可以使用glClearBuffer系列纹理: https ://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM