Unity3d Shader開發(三)Pass(Culling & Depth Testing)



          
      剔除是一種通過避免渲染背對觀察者的幾何體面來提高性能的優化措施。所有幾何體都包含正面和反面。剔除基於大多數對象都是封閉的事實;如果你有一個立方體,你不會看到背離你的那一面(總是隻有一面在你的前方),因此我們不需要繪製出背面。因此也被稱做背面剔除。
      該文章出自【狗刨學習網】

      另一個使得渲染看起來正確的是深度測試。深度測試確保只有場景內的對象的最靠近的表面參與繪製。

Syntax 語法
Cull Back | Front | Off控制幾何體的那一面會被剔除(不繪製) 
Back 


       不繪製背離觀察者的幾何體面。 

Front 


       不繪製面向觀察者的幾何體面,用於由內自外的旋轉對象 
Off 

       顯示所有面。用於特殊效果。

ZWrite On | Off

       控制是否將來之對象的像素寫入深度緩衝(默認開啓),如果你正繪製純色物體,將此項打開。如果你正繪製半透明效果,關閉深度緩衝,更多細節如下

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

       深度測試如何執行。缺省是LEqual (繪製和存在的對象一致或是在其中的對象;隱藏他們背後的對象)

Offset Factor , Units

      允許你定義用兩個參數深度偏移。因子和單位。Factor 縮放Z的最大斜率,幾何體的X和Y也一樣,units縮放可計算的深度緩衝值。這允許你迫使一個幾何體繪製在另一個的上層,儘管他們實際上是在同一個位置。例如偏移0,-1使得靠近攝像機的幾何體忽略幾何體的斜率,而偏移-1,-1則會幾何體在一個幾乎擦過的角度被觀察使看起來更近些。

示例
       這個對象只會渲染對象的背面。

  1. Shader "Show Insides" {
  2.     SubShader {
  3.         Pass {
  4.             Material {
  5.                 Diffuse (0,1,1,1)
  6.             }
  7.             Lighting On
  8.             Cull Front
  9.         }
  10.     }
  11. }
複製代碼

         我把太陽光正對着攝像機,Cube正對攝像機

         

         儘量應用到一個立方體上,並注意當你圍繞幾何體旋轉時,幾何體是如何看起來變糟糕的。 這是因爲你只看見了立方體的內部部分。

玻璃剔除

         控制剔除比背面調試更有用。如果你有透明物體,你經常會想要顯示一個對象的背面。如果你不做任何剔除,你會發現有時常有一部分背面會覆蓋在前面的一部分上。

        下面是一個用於凸物體(球,立方體,車窗)的簡單着色器。

  1. Shader "Simple Glass" {
  2.     Properties {
  3.         _Color ("Main Color", Color) = (1,1,1,0)
  4.         _SpecColor ("Spec Color", Color) = (1,1,1,1)
  5.         _Emission ("Emmisive Color", Color) = (0,0,0,0)
  6.         _Shininess ("Shininess", Range (0.01, 1)) = 0.7
  7.         _MainTex ("Base (RGB)", 2D) = "white" { }
  8.     }

  9.     SubShader {
  10.         // We use the material in many passes by defining them in the subshader.
  11.         // 我們通過把定義放在子着色器中以便可以在許多通道中訪問材質
  12.         // Anything defined here becomes default values for all contained passes.
  13.         // 任何定義在這裏的值都會變成所有內含的通道的默認值
  14.         Material {
  15.             Diffuse [_Color]
  16.             Ambient [_Color]
  17.             Shininess [_Shininess]
  18.             Specular [_SpecColor]
  19.             Emission [_Emission]
  20.         }
  21.         Lighting On
  22.         SeparateSpecular On

  23.         // Set up alpha blending
  24.         // 開啓透明度混合
  25.         Blend SrcAlpha OneMinusSrcAlpha

  26.         // Render the back facing parts of the object.
  27.         // 渲染對象的背面部分
  28.         // If the object is convex, these will always be further away
  29.         // 如果對象是凸, 總是離鏡頭離得比前面更遠。
  30.         // than the front-faces.
  31.         Pass {
  32.             Cull Front
  33.             SetTexture [_MainTex] {
  34.                 Combine Primary * Texture
  35.             }
  36.         }
  37.         // Render the parts of the object facing us.
  38.         // 渲染對象面向我們的部分
  39.         // If the object is convex, these will be closer than the
  40.         // back-faces.
  41.         // 如果對象是凸,總是比背面更靠近鏡頭
  42.         Pass {
  43.             Cull Back
  44.             SetTexture [_MainTex] {
  45.                 Combine Primary * Texture
  46.             }
  47.         }
  48.     }
  49. }
複製代碼

             
          
      剔除是一種通過避免渲染背對觀察者的幾何體面來提高性能的優化措施。所有幾何體都包含正面和反面。剔除基於大多數對象都是封閉的事實;如果你有一個立方體,你不會看到背離你的那一面(總是隻有一面在你的前方),因此我們不需要繪製出背面。因此也被稱做背面剔除。
      該文章出自【狗刨學習網】

      另一個使得渲染看起來正確的是深度測試。深度測試確保只有場景內的對象的最靠近的表面參與繪製。

Syntax 語法
Cull Back | Front | Off控制幾何體的那一面會被剔除(不繪製) 
Back 


       不繪製背離觀察者的幾何體面。 

Front 


       不繪製面向觀察者的幾何體面,用於由內自外的旋轉對象 
Off 

       顯示所有面。用於特殊效果。

ZWrite On | Off

       控制是否將來之對象的像素寫入深度緩衝(默認開啓),如果你正繪製純色物體,將此項打開。如果你正繪製半透明效果,關閉深度緩衝,更多細節如下

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

       深度測試如何執行。缺省是LEqual (繪製和存在的對象一致或是在其中的對象;隱藏他們背後的對象)

Offset Factor , Units

      允許你定義用兩個參數深度偏移。因子和單位。Factor 縮放Z的最大斜率,幾何體的X和Y也一樣,units縮放可計算的深度緩衝值。這允許你迫使一個幾何體繪製在另一個的上層,儘管他們實際上是在同一個位置。例如偏移0,-1使得靠近攝像機的幾何體忽略幾何體的斜率,而偏移-1,-1則會幾何體在一個幾乎擦過的角度被觀察使看起來更近些。

示例
       這個對象只會渲染對象的背面。

  1. Shader "Show Insides" {
  2.     SubShader {
  3.         Pass {
  4.             Material {
  5.                 Diffuse (0,1,1,1)
  6.             }
  7.             Lighting On
  8.             Cull Front
  9.         }
  10.     }
  11. }
複製代碼

         我把太陽光正對着攝像機,Cube正對攝像機

         

         儘量應用到一個立方體上,並注意當你圍繞幾何體旋轉時,幾何體是如何看起來變糟糕的。 這是因爲你只看見了立方體的內部部分。

玻璃剔除

         控制剔除比背面調試更有用。如果你有透明物體,你經常會想要顯示一個對象的背面。如果你不做任何剔除,你會發現有時常有一部分背面會覆蓋在前面的一部分上。

        下面是一個用於凸物體(球,立方體,車窗)的簡單着色器。

  1. Shader "Simple Glass" {
  2.     Properties {
  3.         _Color ("Main Color", Color) = (1,1,1,0)
  4.         _SpecColor ("Spec Color", Color) = (1,1,1,1)
  5.         _Emission ("Emmisive Color", Color) = (0,0,0,0)
  6.         _Shininess ("Shininess", Range (0.01, 1)) = 0.7
  7.         _MainTex ("Base (RGB)", 2D) = "white" { }
  8.     }

  9.     SubShader {
  10.         // We use the material in many passes by defining them in the subshader.
  11.         // 我們通過把定義放在子着色器中以便可以在許多通道中訪問材質
  12.         // Anything defined here becomes default values for all contained passes.
  13.         // 任何定義在這裏的值都會變成所有內含的通道的默認值
  14.         Material {
  15.             Diffuse [_Color]
  16.             Ambient [_Color]
  17.             Shininess [_Shininess]
  18.             Specular [_SpecColor]
  19.             Emission [_Emission]
  20.         }
  21.         Lighting On
  22.         SeparateSpecular On

  23.         // Set up alpha blending
  24.         // 開啓透明度混合
  25.         Blend SrcAlpha OneMinusSrcAlpha

  26.         // Render the back facing parts of the object.
  27.         // 渲染對象的背面部分
  28.         // If the object is convex, these will always be further away
  29.         // 如果對象是凸, 總是離鏡頭離得比前面更遠。
  30.         // than the front-faces.
  31.         Pass {
  32.             Cull Front
  33.             SetTexture [_MainTex] {
  34.                 Combine Primary * Texture
  35.             }
  36.         }
  37.         // Render the parts of the object facing us.
  38.         // 渲染對象面向我們的部分
  39.         // If the object is convex, these will be closer than the
  40.         // back-faces.
  41.         // 如果對象是凸,總是比背面更靠近鏡頭
  42.         Pass {
  43.             Cull Back
  44.             SetTexture [_MainTex] {
  45.                 Combine Primary * Texture
  46.             }
  47.         }
  48.     }
  49. }
複製代碼

             
發佈了0 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章