Unity Shader(ShaderLab)着色器簡介

轉載請註明出處!
  近期花了一個多月時間把Unity5.x的Shader簡單學習了一下,發現Shader實現的渲染機制魅力太大了!而且比以前版本的Shader更加牛逼!
  下面簡單介紹一下Unity的Shader:
  儘管Unity Shader翻譯過來是Unity着色器,但它並非真正渲染管線的Shader,它與真正意義上的Shader有很大的不同。以前我還不明白Unity的Shader和ShaderLab有什麼不同,學習後才知道Unity Shader實際上指的就是一個ShaderLab文件,硬盤上以.shader爲後綴的一種文件。Unity Shader可以理解爲就是ShaderLab,它是在傳統Shader上進行了高度封裝。Unity Shader是用ShaderLab語言編寫的,但對於表面着色器和頂點/片元着色器,可以在ShaderLab內部嵌套Cg/HLSL語言來編寫着色器代碼。
  Unity Shader(以下簡稱Shader)總是跟我們的Material(材質)相關聯,也經常使用到Texture(紋理)進行渲染,Shader的渲染過程大體是:根據模型的UV座標以及模型在屏幕的顯示面,把顏色或紋理上對應的像素值顯示到屏幕上,獲取到顏色後還要與Unity中的光照信息進行融合,從而使模型顯示出需要的效果。
  學習了Shader以後,我把相關經驗總結一下:
  1、Shader是圖形學方面的運用,能通過代碼來操作計算機繪畫,並且能實現各種逼真的顯示效果(例如水面、漂浮的霧效等),但是學習Shader前需要了解一下計算機的渲染過程,例如CPU和GPU的通信、渲染流水線等。
  2、Shader中會用到大量的物理方面知識和數學計算,例如物理中的反射與折射的運用、數學矩陣來變換頂點或向量在各種座標系的位置等,Shader本來就是圖形學方面的知識,因此需要大體瞭解基礎3D數學(座標系、點和矢量、矩陣和變換、Unity的不同座標空間、法線等等)。
  3、Shader主要是通過頂點/片元着色器來實現渲染過程的。模型是由好多的三角形片面組成的,而頂點着色器主要把模型中的所有三角形的三個頂點進行座標變換,變換到統一座標空間中,並且讓計算機知道各個頂點在屏幕的顯示位置;而片元着色器就是紋理和顏色中的色素賦值到模型對應的座標上,並且與關照顏色、環境顏色等計算的信息進行融合,然後輸出到屏幕中。因爲一個頂點着色器的處理過程是與模型的三角形片面數量相關,而片元着色器的處理過程是與模型的像素點數量相關,很明顯片元着色器函數的調用次數遠遠多餘頂點着色器函數。頂點和片元着色器都可以處理關於關照方向、視角方向等信息,但是頂點着色器的調用次數遠少於片元着色器的調用,因此頂點着色器中處理一些向量數據會造成模型的三角形片元邊界出現鋸齒現象,而片元着色器中計算量過大又會影響性能,所以使用時可以綜合考慮。
  4、Shader的光照主要包含環境光、自發光、反射光、折射光等,而反射光又有很多種,例如漫反射、高光發射、菲涅爾反射等的計算。而光照還涉及到光照衰減、陰影效果的實現等。Unity的渲染路徑分爲三種:向前渲染路徑、定點照明渲染路徑、延遲渲染路徑。其中Unity5.x版本已經拋棄了頂點照明渲染路徑,但是可以兼容以前版本的頂點照明渲染。
  5、Shader中將紋理的顏色賦值到模型上就是一中紋理採樣的過程。紋理分爲普通紋理、法線紋理、高度紋理、漸變紋理、遮罩紋理,以及更高級的噪聲紋理等。而rgba顏色的各個通道的值在Shader中的範圍是[0,1]。
  6、Shader實現透明效果就是根據採樣的rgba顏色或者自己設定的rgba顏色中a通道的值來實現透明效果,透明效果包括透明度測試和透明度混合。透明度測試是把所有a通道的值低於設定值的片元全部剔除,不顯示在屏幕上。不能實現半透明效果;而透明度混合是根據a通道的具體值來實現半透明效果,例如a=1表示完全不透明,a=0表示完全透明。
  7、Shader中可以通過代碼來對紋理採樣的座標進行改變,從而能達到動畫的效果。
  8、Shader與C#的結合使用,可以獲取到攝像機捕獲的屏幕截圖以及深度紋理和法線紋理,從而實現屏幕的後期處理效果,例如:模糊效果、高度霧效、亮度飽和度等等,更高級的是實現素描效果、3D卡通效果等等,效果非常棒。但是在移動平臺可能會對性能造成較大的影響。
  9、Unity的表面着色器起始就是在頂點和片元着色器的基礎上進一步的抽象和封裝,只需要給出相關數據,Unity會在背後自動將數據生成相應的頂點/片元着色器,來實現我們想要的效果。但是表面着色器會犧牲頂點/片元着色器的自由度,無法實現一些自定義的渲染效果,而且往往會對性能造成一定的影響。
 10、Unity的許多性能優化都是跟渲染相關的,例如批處理技術、遮擋剔除技術、減少實時光照和陰影、LOD技術等等。

  最後推薦大家一本教程《Unity Shader入門精要》,16年出版,作者是馮樂樂(一名程序員妹子)。由淺入深的教學,並且都是有案例說明。PS:本人不是託……本來我是不喜歡看書的,但是網上關於Unity5.2以後的Shader教程很少,抱着試試的心理買了這本最新版的書,看着還不錯。然後花了一個半月看完了,收穫很多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章