顾名思义,为了渲染出不同透明度的级别,我们需要开启混合。
step1: 需要启用混合(Blending),通过GL_BLEND
glEnable(GL_BLEND);
step2:告知OpenGL 如何进行Blending
void glBlendFunc(GLenum sfactor, GLenum dfactor);
详细分析:
以下为计算混合的方程式
C¯result=C¯source∗Fsource+C¯destination∗Fdestination
- 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.6⎞⎠⎟⎟⎟∗0.6+⎛⎝⎜⎜⎜1.00.00.01.0⎞⎠⎟⎟⎟∗(1−0.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=Src−Dst
- GL_FUNC_REVERSE_SUBTRACT:彼此元素相减,但顺序相反:
Cresult=Dst−Src
.
通常我们可以简单地省略glBlendEquation因为GL_FUNC_ADD在大多数时候就是我们想要的,但是如果你如果你真想尝试努力打破主流常规,其他的方程或许符合你的要求。
渲染半透明纹理
有几个注意点:为了解决互为半透明物体的透视效果正确,并且深度缓存没有问题。
- 注意透明物体的绘制顺序
- 先绘制不透明,再为透明物体排序(根据远近)
- 优先绘制远的物体,最后绘制近的物体