剪裁和深度测试

作者:追风剑情 发布于:2014-5-27 22:26 分类:Shader

   剪裁是一种通过不渲染背对摄像机的几何面来提高性能的优化措施。所有几何体都包含正面和反面。剪裁基于大多数对象都是封闭的事实。例如一个立方体,摄像机无法看到背离摄像机的那一面(总是只有一个面面向前方),因此不需要绘制出背面。因此也被称做背面剪裁。

   使用深度测试使渲染看起来更加真实,而且可以保证场景中的对象被遮挡的部分不参与绘制。相关命令如下所列。

Cull 剪裁模式

控制对象的哪一面被剪裁掉(即不绘制)。剪裁模式参数解释如表:

剪裁模式参数

Back 不绘制背离摄像机的面(这是默认项)
Front 不绘制面向摄像机的面
Off 绘制所有的面,用于某些特殊效果

  可以控制的剪裁比调试背面更有用。如果想要显示一个透明物体,往往要显示这个物体的背面。如果关闭了剪裁,很可能物体后面的一些面和前面的一些面重叠。下面有一个简单的着色器,它将作用于一些凸面物体(球体、立方体、汽车挡风玻璃等):


Shader "Simple Glass" {
     Properties {
      _Color ("Main Color", Color) = (1, 1, 1, 0)	 //定义颜色属性
      _SpecColor ("Spec Color", Color) = (1, 1, 1, 1)	 //定义颜色属性
      _Emmisive ("Emmisive Color", Color) = (0, 0, 0, 0) //定义颜色属性
      _Shininess ("Shininess", Range (0.01, 1)) = 0.7	 //定义浮点数范围属性
      _MainTex ("Base (RGB)", 2D) = "white" {}	 //定义2D纹理属性
   }
   SubShader {
      Material {
         Diffuse [_Color]	 //设置漫反射光颜色
         Ambient [_Color]	 //设置环境光颜色
         Shininess [_Shininess]	 //设置加亮时光泽度
         Specular [_SpecColor]	 //设置镜面高光颜色
         Emission [_Emmisive]	 //设置自发光颜色
      }
      Lighting On	 //开启顶点光照
      SeparateSpecular On	 //开启高光
      Blend SrcAlpha OneMinusSrcAlpha  //设置alpha混合
      Pass {
         Cull Front  //剪裁前面
         SetTexture [_MainTex] { //设置纹理
	     Combine Primary * Texture //设置合并方式
	 }
      }
      Pass {
	 Cull Back  //背面剪裁
	 SetTexture [_MainTex] {
	     Combine Primary * Texture
	 }
      }
   } 
}
说明: 在子着色器中设置的命令会成为子着色器中的所有通道的默认项。


ZWrite 开关状态

   控制是否将来自于对象的像素信息写入深度缓冲(默认开启)。如果绘制固定物体,设置为On;绘制半透明物体时设为Off

ZTest 测试模式

   设置深度测试如何执行。默认是LEqual(依据现有对象的距离绘制对象,隐藏小于设置的值的对象)。

Offset 因子,单位

   深度偏移允许指定两个参数:因子(Factor)和单位(Units),因子设置Z关于多边形的X或Y的最大斜率。单位设置最小可分辨深度缓冲的值。当两个多边形在同一深度时,可以强制设定一个多边形比另外一个多边形优先绘制,解决当前深度值与下一步绘制的表面深度太接近产生的深度冲突问题。


Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号