Opengl 将透明纹理渲染到纹理上

Opengl 将透明纹理渲染到纹理上,opengl,fbo,alpha-transparency,Opengl,Fbo,Alpha Transparency,我在opengl中工作了一段时间,工作相对平稳,但最近我注意到,当我在fbo纹理(自定义帧缓冲区)上渲染带有透明纹理的基本体时,它会使fbo纹理在像素处透明,基本体的纹理是透明的。问题是,在透明原语之前,该原语(使用纯色)后面已经渲染了一些内容。所以fbo纹理在这些像素处不应该是透明的-混合纯色和透明色应该会产生纯色,不是吗 因此,基本上,opengl将透明度添加到我的fbo纹理,只是因为最后绘制的基本体具有透明像素,即使其后面已经绘制到fbo纹理中有纯色。如果fbo纹理在渲染透明基本体之前已经

我在opengl中工作了一段时间,工作相对平稳,但最近我注意到,当我在fbo纹理(自定义帧缓冲区)上渲染带有透明纹理的基本体时,它会使fbo纹理在像素处透明,基本体的纹理是透明的。问题是,在透明原语之前,该原语(使用纯色)后面已经渲染了一些内容。所以fbo纹理在这些像素处不应该是透明的-混合纯色和透明色应该会产生纯色,不是吗

因此,基本上,opengl将透明度添加到我的fbo纹理,只是因为最后绘制的基本体具有透明像素,即使其后面已经绘制到fbo纹理中有纯色。如果fbo纹理在渲染透明基本体之前已经填充了纯色,那么opengl不应该将透明纹理与fbo的现有像素混合,并生成纯色吗

当我将fbo纹理渲染到默认帧缓冲区时,会发生的情况是,清晰的颜色会通过它的某些部分,其中最后绘制的纹理是透明的。但是,当我将同一场景直接渲染到默认的opengl帧缓冲区时,场景看起来很好,并且清晰的颜色不会渗透到透明纹理中

更有趣的是glClearColor-颜色仅在基本体的纹理alpha具有渐变时可见-清晰颜色对纹理alpha为1.0或0.0的位置没有影响。。。这是虫子吗?对于0.5 alpha的像素,它似乎对基本体的纹理影响最大。然后,进一步向上或向下移动会降低glClearColor的影响

我知道这是一个有点复杂的问题/情况,我诚恳地尽力解释

我正在使用:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
将部分透明的基本体绘制到fbo纹理中,然后将fbo纹理绘制到默认帧缓冲区

这是绘制到默认opengl fbo中的fbo纹理的外观:

glClearColor设置为红色

混合纯色和透明色应该会产生纯色,不是吗

只有当混合模式告诉它时。但事实并非如此:

这将对颜色的所有四个组成部分应用相同的混合操作。这将导致最终alpha是源alpha乘以自身并将其添加到目标alpha乘以1-src alpha的结果

现在,可以对颜色和alpha使用单独的混合函数:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
最后两个参数仅指定alpha的混合,而前两个参数指定RGB颜色的混合。所以这保留了阿尔法。GL3.x及更高版本上提供了单独的混合功能,但也可以作为旧硬件的扩展提供

但在我看来,你可能根本不想改变阿尔法。因此,渲染到纹理时,只需执行以下操作:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);

如果要再次写入alpha遮罩,请不要忘记撤消它。

在将fbo的纹理绘制到屏幕之前,是否记得重置混合?此外,任何代码或它发生的屏幕截图都会很好。您是否验证了启用了GL_混合?屏幕截图添加:)我不想重置混合,因为我确实希望有透明的fbo纹理,问题是fbo纹理在不应该的地方是透明的,与默认帧缓冲区的清晰颜色混合,在哪里可以看到透明度,在哪里不应该看到?这难道不是过滤的结果吗?(将fbo的纹理应用于四边形时)clearColor is(红色)似乎正在影响fbo纹理,其中四边形的纹理具有渐变,完全不透明的部分正确(图像左侧),完全透明的部分也正确,与背景完全混合(右侧)-但是中间的渐变受clearcolorHey的影响,很抱歉回来了,但是现在,当我在完成渲染到第一个fbo纹理后将所有遮罩的组件重置为“true”,然后尝试渲染第一个fbo纹理后面的另一层(第二个fbo纹理)时,第一个fbo纹理中的透明四边形纹理仅在该fbo中已有纯色的位置可见。。它适用于1 fbo纹理!你知道我如何正确地渲染多个fbo纹理吗?提前谢谢如果我没有重置GLCOLORSMASK,那么底层就根本没有绘制
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);