Alpha Testing与Alpha Blending对比

摘抄自引用
Alpha Test和Alpha Blending是两种处理透明的方法。
Alpha Test采用一种很霸道极端的机制,只要一个像素的alpha不满足条件,那么它就会被fragment shader舍弃。被舍弃的fragments不会对后面的各种Tests产生影响;否则,就会按正常方式写入到缓存中,并进行正常的深度检验等等,也就是说,Alpha Test是不需要关闭ZWrite的。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
而Alpha Blending则是一种中庸的方式,它使用当前fragment的alpha作为混合因子,来混合之前写入到缓存中颜色值。但Alpha Blending麻烦的一点就是它需要关闭ZWrite,并且要十分小心物体的渲染顺序。如果不关闭ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite。
注意:Alpha Blending只是关闭ZWrite,并没有关闭ZTest!这意味着,在输出一个Alpha Blending的fragment时,它还是会判断和当前Color Buffer中的fragment的深度关闭,如果它比当前的fragment深度更远,那么它就不会再做后续的混合操作;否则,它就会和当前的fragment进行混合,但是不会把自己的深度信息写入Depth Buffer中。这是非常重要的,这一点决定了,即便一个不透明物体出现在一个透明物体的前面,不透明物体仍可以正常的遮挡住透明物体!也就是说,对于Alpha Blending来说,Depth Buffer是只读的。

blending(混合)

$$Value_{output}=Value_{src} * Factor_{src}\ [OP]\ Value_{dst} * Factor_{dst}$$ 这就是应用面极广的blending操作。
它不光可以应用在颜色领域,也可以应用到动画领域等等,其应用都遵循同样的模式
 已有一个值(dst),现在有另一个值(src)想要参与到该值里面来,问最后是什么值。
比如颜色混合,就是画板上已有一个颜色(dst),现在用一只画笔涂在dst上,问dst变成什么值。
比如动画数据,就是人体已有一套动作数据(dst)在驱动,现在有另一套动作数据想融合到原先动作上,问dst是什么动作。
在webgl里有gl.blendFunc(sfactor, dfactor)函数,作为函数参数的sfactor与dfactor合法取值范围是预定义的几个值,每个预定义值的含义(包含相关的处理过程)是明确规定的。
注意:这里的sfactor与dfactor不是开头公式里的Factor,它们的关系是sfactor与dfactor的取值,决定了Factor的值。比如webgl里sfactor取gl.ONE时,有SouceFactor取值为1。关于alpha blending里factor的取值参考blendFunc
公式里还有一个[OP],在webgl里用gl.blendEquation(mode)来对应它。mode也是预定义的几个值,代表预定义的几个[OP],比如:
mode还有其他一些取值,参考blendEquation
另:RGBA不同的Component或channel可以分别设置不同的blendFunc与blendEquation

对于“权”的理解

看到加权平均数,却很不理解这个计算公式,想了想,其实主要难点在于对“权”的理解。
权就是权重,赋权就是一种数字化,亦即将某个事物量化,想到这里,平均数里还应有另外一个对象,联合起来描述平均数的意义就应该是:一个单位尺度(分母)的一种对象,对应了多少另一种(分子)对象。算术平均数就很好这么理解了,加权平均数按刚才的思考,一个单位尺度的那种对象和通常算术平均数的一个单位尺度的那种对象其实是不同的东西,怎么形象理解呢?就是普通算术平均数的一个单位尺度的那种对象是指一个完整的人的话,那么加权平均数里的这个对象,就是把所有人都切成相同尺寸的薄片后的那个薄片,然后对薄片总数求平均数,形式上和求算术平均数达成了一致,但薄片和人当然不是一个东西。加权的意义是什么呢?这就是人分三六九等这个显而易见的事实的数学处理了,我比较初级,同样的薄片,我只能切成10片,你比较高级,就能切成100片,真惨。一个人的薄片数在所有人的总薄片数中的比例就是这个人的权重。这样想了一圈感觉不合常理,又想了一大圈,嗯,整明白了,是算术平均数不合常理,它把所有人都当作是由完全相同数量和尺寸的薄片组成的实体了。迷糊,有点上头,我到底整明白没有咧?!
整体上再来看一看,发觉其实没这么多虚头巴脑的,你的需求可以把对象平等对待,那就算术平均。需求要区分人的差别,那就用加权。想多了…凌晨被傻蛾子闹醒了,小家伙蹲床头那儿哭,抱起来到客厅秒睡,放下他我又睡不着了,刷抖音到手机快没电,就翻了一下书,就翻到加权平均数,就迷糊了,就死磕了这么多…现在早上五点半了,睡觉去
一个薄片就是一权,薄片数量在总薄片数量占比就是权重值,这就是我理解的基于薄片作为单位来计算平均值的意思,这样就能对应加权平均数的计算公式了。所以加权平均数里首先要清楚把什么东西作为权重对象
关于“股票的平均价格”的例子 这个例子比较好的说明了我上面表达的平均数的意义,在这个股票的例子里就是一股(单位尺度)的股票(对象),对应了(多少)价格(即另一种对象)。注意,价格是用元来描述,股票A的价格总量就是单价*薄片(股),股票B的价格总量亦如此计算,最后价格的平均数为两只股票的价格总量之和,除以薄片(股)数量(即股数之和、总股数),把加法拆开,就很清楚的解释了前面的理解:薄片数量在总薄片数量占比就是权重值 $$\overline{x}=\frac{x_1*n_1+x_1*n_2+\ldots+x_k*n_k}{n_1+n_2+\ldots+n_k}$$ $$\overline{x}=x_1*w_1+x_2*w_2+\ldots+x_k*w_k$$

片元着色器(fragment shader)

引文1
光栅化(Rasterization) 后得到的就得到了一个个“片元”。片元和像素已经非常接近了,但两者仍是有区别的。用一种通俗的说法来解释的话,就是比如三维空间内有两个从摄像机角度看过去一前一后的三角形,它们重叠部分的显示区域,每个像素对应两个片元;不重叠的部分,像素和片元一一对应。
 更专业的说法是,片元在成为像素之前,还会做多种测试(比如深度测试、透明度测试、模板测试)以决定其最终是否会被显示为像素。所以,严格来说,“片元”和“像素”并不是一一对应的。
卡通渲染(Toon Shading)