【发布时间】:2019-06-10 19:42:10
【问题描述】:
我的场景由渲染到帧缓冲区的层组成。在帧缓冲区中,元素被拉回前面并与ColorWithAlpha 或EraseWithAlpha 混合。帧缓冲区与相应的 *WithPremultipliedAlpha 版本混合。以下代码控制混合:
switch (m_blendMode)
{
case BlendMode::ColorWithAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::ColorWithPremultipliedSrcAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::EraseWithAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::EraseWithPremultipliedSrcAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
break;
}
我正在努力跨帧缓冲区边界进行擦除。使用ColorWithAlpha 将所有元素从后向前绘制到一个帧缓冲区中,相当于将除一个之外的所有元素绘制到一个帧缓冲区中,然后使用ColorWithAlpha 将最后一层绘制到单独的帧缓冲区中,然后使用将单独的帧缓冲区混合到原始帧缓冲区中ColorWithPremultipliedAlpha。擦除也不一样。我尝试使用ColorWithAlpha 和EraseWithPremultipliedAlpha 将图层重新绘制到前面,以将目标FBO 与dest FBO 混合。不幸的是,这并不等同于使用EraseWithAlpha 将顶部 FBO 中的所有元素直接绘制到 dest FBO 中。是否可以使擦除混合模式关联,启用与着色模式相同的设置?如果没有,是否有关联的伪擦除混合模式可以在这里交换?
【问题讨论】:
标签: opengl framebuffer alphablending