在 OpenGL 中渲染到纹理(辅助帧缓冲器)时,任何透明内容都会覆盖下面内容的透明度,而不是像透明度那样添加透明度。这意味着,如果我在现有不透明对象上渲染透明对象,则结果是透明的纹理,即使它应该是不透明的。
在此图片中,空间通常呈现为背景,然后更改,然后渲染不透明的蓝色,然后渲染绿色/红色。渲染到的纹理用于渲染到原始纹理(窗口),结果如所见。framebufferframebufferframebuffer
一些代码:
帧缓冲器/纹理创建:
int texture = glGenTextures();
framebufferID = glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER,framebufferID);
glBindTexture(GL_TEXTURE_2D, texture);
int width,height;
width = (int)(getMaster().getWindow().getWidth()*(xscale/(16f*getMaster().getGuiCamera().getWidth()))*1.2f);
height = (int)(getMaster().getWindow().getHeight()*(yscale/9f)*1.15f);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture,0);
int depth = glGenTextures();
glBindTexture(GL_TEXTURE_2D, depth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0);
this.texture = new Texture(texture,width,height,true);
glDrawBuffer(GL_FRONT_AND_BACK);
这里的深度缓冲区是我试图让它工作的东西,但它对输出纹理没有影响。
使用透明对象渲染 0 中的不透明对象不会导致生成的像素是透明的,否则它们将显示为 和不透明对象的混合,那么为什么在我用来渲染到纹理的中会发生这种情况呢?难道不应该是一致的吗?我觉得也许我错过了一些依恋,但我不能确定是什么。我看到一个解决方案说使用,最后一个错误的意思是没有alpha写入,乍一看似乎可以工作,但是当透明度是我想要的时,我为什么要禁用透明度呢?如果保持打开状态,它似乎也会导致许多问题。任何人都可以提供一些见解吗?提前致谢!framebufferglClearColorframebufferframebufferglColorMask(true,true,true,false)
编辑:经过进一步分析,glColorMask不是解决方案。
翻翻过去那场雪
慕仙森
相关分类