Unity中的CG编写Shader系列(Blend)

1.不透明度

当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到底以怎样的形式混合在一起最后输出到帧缓存中是我们现在首要讨论的内容。

1.混合(blending)

上一篇文章中的管道环节中的“逐帧操作”环节中的一项操作就是混合操作,可见混合操作是不可编程的固定功能环节。

在混合操作中,我们将片段着色器中计算出来的颜色称之为 “源颜色”,帧缓存中对应的像素已经存在的颜色叫做“目标颜色”。混合操作就是将源颜色与目标颜色以一些选项进行结合。

既然是固定功能环节,那么这些选项我们只能选择,不能编写。

我们选择混合的选项的过程是通过以下面的等式来进行RGBA颜色的计算的:

float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;

Unity中的Shader 通过ShaderLab语法表达的混合操作过程为,例:

        Blend SrcAlpha OneMinusSrcAlpha        //alpha blending
        Blend One OneMinusSrcAlpha             //premultiplied alpha blending
        Blend One One                          //additive
        Blend SrcAlpha One                     //additive blending
        Blend OneMinusDstColor One             //soft additive
        Blend DstColor    Zero                 //multiplicative
        Blend DstColor SrcColor                //2x multiplicative
        Blend Zero SrcAlpha                    //multiplicative blending for attenuation by the fragment's alpha

所以混合操作的基本语法为

Blend SrcFactor DstFactor

其中这2个代号分别可以选择的选项如下表:

选项代号

与之等价的代码

One

float4(1.0)

Zero

float4(0.0)

SrcColor

fragment_output

SrcAlpha

float4(fragment_output.a)

DstColor

pixel_color

DstAlpha

float4(pixel_color.a)

OneMinusSrcColor

float4(1.0) - fragment_output

OneMinusSrcAlpha

float4(1.0 - fragment_output.a)

OneMinusDstColor

float4(1.0) - pixel_color

OneMinusDstAlpha

float4(1.0 - pixel_color.a)

其中float4(1.0)的写法我们前面已经见过,等价于float4(1.0,1.0,1.0,1.0)

并且其中所有向量的分量区间都是[0,1]区间。

 

posted @ 2014-10-29 13:48  Lewis.Xiaoa  阅读(7867)  评论(1编辑  收藏  举报