Unity3D会给人一个这样的印象:超简单的使用方法,方便的可视化创作环境,完美的工作流程,高效的工作效率……但同时它比当时的Flash有一个无可比拟的优势:它已经有成熟的并广为人知的脚本语言:C#和Javascript。
这些特点可以归结到一点:可以让无数水平不等的使用/开发者轻松上手。
今天和大家分享一下Unity3D培训学习资料中Unity里的CG编写Shader系列(Blend)
不透明度
当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到底以怎样的形式混合在一起最后输出到帧缓存中是我们现在首要讨论的内容。
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
其中float4(1.0)的写法我们前面已经见过,等价于
float4(1.0,1.0,1.0,1.0)
并且其中所有向量的分量区间都是[0,1]区间。
本学习资料出自蓝鸥科技Unity3D培训,转载请注明。