在 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不是解决方案。
2 回答
慕仙森
TA贡献1827条经验 获得超7个赞
对于任何想知道的人,解决我的问题的最佳解决方案是使用“GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE_MINUS_DST_ALPHA,GL_ONE”)而不是“GL_SRC_ALPHA”,GL_ONE_MINUS_SRC_ALPHA)
添加回答
举报
0/150
提交
取消