OpenGL 记录 -- 关于“混合”渲染

顾名思义,为了渲染出不同透明度的级别,我们需要开启混合。

step1: 需要启用混合(Blending),通过GL_BLEND
glEnable(GL_BLEND);

step2:告知OpenGL 如何进行Blending
void glBlendFunc(GLenum sfactor, GLenum dfactor);

详细分析:
以下为计算混合的方程式

C¯result=C¯sourceFsource+C¯destinationFdestination

  • C¯source  :源颜色向量。纹理本身的颜色
  • C¯destination  目标颜色向量。存储在颜色缓冲中当前位置的颜色向量。
  • F¯source  源因子。设置了对源颜色的alpha值影响。
  • F¯destination  :目标因子。设置了对目标颜色的alpha影响。

example:

这里写图片描述

我们有两个方块,我们希望在红色方块上绘制绿色方块。红色方块会成为目标颜色(它会先进入颜色缓冲),我们将在红色方块上绘制绿色方块。

那么问题来了:我们怎样来设置因子呢?我们起码要把绿色方块乘以它的alpha值,所以我们打算把 Fsrc 设置为源颜色向量的alpha值:0.6。接着,让目标方块的浓度等于剩下的alpha值。如果最终的颜色中绿色方块的浓度为60%,我们就把红色的浓度设为40%(1.0 – 0.6)。所以我们把 Fdestination 设置为1减去源颜色向量的alpha值。方程将变成:

C¯result=0.01.00.00.60.6+1.00.00.01.0(10.6)

最终方块结合部分包含了60%的绿色和40%的红色,得到一种脏兮兮的颜色:
这里写图片描述
最后的颜色被储存到颜色缓冲中,取代先前的颜色。

step3:选择合适的选项因子 为函数 glBlendFunc(GLenum sfactor, GLenum dfactor)

这里写图片描述

也可以为RGB和alpha通道各自设置不同的选项,使用glBlendFuncSeperate:

    glBlendFuncSeperate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,GL_ONE, GL_ZERO);

这个方程就像我们之前设置的那样,设置了RGB元素,但是只让最终的alpha元素被源alpha值影响到。

void glBlendEquation(GLenum mode)允许我们设置这个操作,有3种可行的选项:

  • GL_FUNC_ADD:默认的,彼此元素相加: Cresult=Src+Dst
  • GL_FUNC_SUBTRACT:彼此元素相减: Cresult=SrcDst
  • GL_FUNC_REVERSE_SUBTRACT:彼此元素相减,但顺序相反: Cresult=DstSrc .
    通常我们可以简单地省略glBlendEquation因为GL_FUNC_ADD在大多数时候就是我们想要的,但是如果你如果你真想尝试努力打破主流常规,其他的方程或许符合你的要求。

渲染半透明纹理

有几个注意点:为了解决互为半透明物体的透视效果正确,并且深度缓存没有问题。

  • 注意透明物体的绘制顺序
  • 先绘制不透明,再为透明物体排序(根据远近)
  • 优先绘制远的物体,最后绘制近的物体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值