Unity3D Shader编程 原文链接:
http://blog.csdn.net/zhmxy555/article/category/2681301
VS Shader插件
今天装了一个可以在VS中写Shader的插件,有高亮和自动提示的功能。唯一不好的就是不能自动格式化,强迫症患者表示很伤……
下载地址:
http://blog.shuiguzi.com/2014/10/28/Release/index.html
子着色器(SubShader)详解
在第三篇文章里,对子着色器的写法做了很详细的讲解,用文字的方式列出来结构不明显,所以我做了一个结构图,如下。其中可能有一些不清晰或错的地方,后面可能会更新。如果大家想更详细的了解一下,可以参考上述博客的《【Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合》。
第四篇文章概念性的内容比较少,就先整理第四骗的概念,这两篇的实战练习留到下一篇写。
剔除 (Culling) 与深度测试 (Depth Testing)
1.剔除
不绘制被挡住或视角以外的我们看不到的物体。
2.深度测试
深度测试可以简化复杂场景的绘制,确保只有场景内的对象的最靠近的表面参与绘制。
3.相关语句
Cull Back | Front | Off
用于控制几何体的哪一面会被剔除(也就是不被绘制) 。其中:
Back:不绘制背离观察者的几何面
Front:不绘制面向观察者的几何面,用于由内自外的旋转对象
Off:显示所有面。用于特殊效果。
ZWrite On | Off
此语句用于控制是否将来之对象的像素写入深度缓冲(默认开启),如果需要绘制纯色物体,便将此项打开。如果要绘制半透明效果,关闭深度缓冲。
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
此语句用于控制深度测试如何执行。缺省值是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏其背后的对象)。
Offset Factor ,Units
此语句用两个参数(Facto和Units)来定义深度偏移。Factor参数表示 Z缩放的最大斜率的值。Units参数表示可分辨的最小深度缓冲区的值。
于是,我们就可以强制使位于同一位置上的两个集合体中的一个几何体绘制在另一个的上层。例如偏移量Offset 设为0, -1(即Factor=0, Units=-1)的值使得靠近摄像机的几何体忽略几何体的斜率,而偏移量为-1,-1(即Factor =-1, Units=-1)时,则会让几何体偏移一个微小的角度,让观察使看起来更近些。
Alpha测试(Alpha testing)
在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中。评论里有人说这段话说的不对,不是和透明度比较,而是和深度比较,就像下面那句话一样。这里读的时候确实感到有点矛盾,但是目前接触到的资料比较少,等以后有了更深入的理解再进行修正。
Alpha测试在渲染凹形物体的透明部分时非常有用。显卡上有着每个像素写到屏幕上的深度记录。如果一个新的像素比原来的像素的深度深,那么新的像素就不会被写到屏幕中。
AlphaTest Off
此语句用于渲染所有像素(缺省)。
AlphaTest comparison AlphaValue
comparison 取值同上面的 ZTest。
基本雾效(Fog)
雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的最终的颜色来完成的。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。
Fog { FogCommands }
此语句用于设定雾命令的内容,具体的填在大括号之中的内容见下面的语句。
Mode Off | Global | Linear | Exp | Exp2
此语句用于定义雾模式。缺省是全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值。
Color ColorValue
此语句用于设定雾的颜色值。
Density FloatValue
此语句以指数的方式设定雾的密度。
Range FloatValue, FloatValue
此语句用于为linear类型的雾设定远近距离值。