为了账号安全,请及时绑定邮箱和手机立即绑定

渲染 覆盖透明度 时渲染到纹理时使用透明度

渲染 覆盖透明度 时渲染到纹理时使用透明度

慕田峪9158850 2022-09-14 16:53:11
在 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贡献2065条经验 获得超14个赞

您必须使用可分离的混合函数,该函数分别处理 RGB 和 Alpha 值:gl混合通知分离。对于您继续使用的 RGB 值。对于 Alpha 值,请使用类似的东西,以便事情简单地相加。GL_SRC_ALPHA, GL_SRC_ONE_MINUS_ALPHAGL_ONE, GL_ONE

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);


查看完整回答
反对 回复 2022-09-14
?
慕仙森

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)


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信