為方便個人手機學習時候查閱,從網上轉來這些彩圖。
如屬過當行為,聯系本人刪除。
勘錯表 http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html
轉自:http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_images.html
前言
第2章 渲染流水線
圖2.1 真實生活中的流水線
圖2.2 渲染流水線中的三個概念階段
圖2.3 渲染所需的數據(兩張紋理以及3個網格)從硬盤最終加載到顯存中。在渲染時,GPU可以快速訪問這些數據
圖2.4 在同一狀態下渲染三個網格。由於沒有更改渲染狀態,因此三個網格的外觀看起來像是同一種材質的物體。
圖2.5 CPU通過調用Draw Call來告訴GPU開始進行一個渲染過程。一個Draw Call會指向本次調用需要渲染的圖元列表
圖2.6 GPU的渲染流水線實現。顏色表示了不同階段的可配置性或可編程性:綠色表示該流水線階段是完全可編程控制的,黃色表示該流水線階段可以配置但不是可編程的,藍色表示該流水線階段是由GPU固定實現的,開發者沒有任何控制權。實線表示該shader必須由開發者編程實現,虛線表示該Shader是可選的
圖2.7 GPU在每個輸入的網格頂點上都會調用頂點着色器。頂點着色器必須進行頂點的坐標變換,需要時還可以計算和輸出頂點的顏色。例如,我們可能需要進行逐頂點的光照
圖2.8 頂點着色器會將模型頂點的位置變換到齊次裁剪坐標空間下,進行輸出后再由硬件做透視除法得到NDC下的坐標
圖2.9 只有在單位立方體的圖元才需要被繼續處理。因此,完全在單位立方體外部的圖元(紅色三角形)被舍棄,完全在單位立方體內部的圖元(綠色三角形)將被保留。和單位立方體相交的圖元(黃色三角形)會被裁剪,新的頂點會被生成,原來在外部的頂點會被舍棄
圖2.10 屏幕映射將x、y坐標從(-1, 1)范圍轉換到屏幕坐標系中
圖2.11 OpenGL和DirectX的屏幕坐標系差異。對於一張512*512大小的圖像,在OpenGL中其(0, 0)點在左下角,而在DirectX中其(0, 0)點在左上角
圖2.12 三角形遍歷的過程。根據幾何階段輸出的頂點信息,最終得到該三角網格覆蓋的像素位置。對應像素會生成一個片元,而片元中的狀態是對三個頂點的信息進行插值得到的。例如,對圖2.12中三個頂點的深度進行插值得到其重心位置對應的片元的深度值為-10.0
圖2.13 根據上一步插值后的片元信息,片元着色器計算該片元的輸出顏色
圖2.14 逐片元操作階段所做的操作。只有通過了所有的測試后,新生成的片元才能和顏色緩沖區中已經存在的像素顏色進行混合,最后再寫入顏色緩沖區中
圖2.15 模板測試和深度測試的簡化流程圖。
圖2.16 混合操作的簡化流程圖
圖2.17 圖示場景中包含了兩個對象:球和長方體,繪制順序是先繪制球(在屏幕上顯示為圓),再繪制長方體(在屏幕上顯示為長方形)。如果深度測試在片元着色器之后執行,那么在渲染長方體時,雖然它的大部分區域都被遮擋在球的后面,即它所覆蓋的絕大部分片元根本無法通過深度測試,但是我們仍然需要對這些片元執行片元着色器,造成了很大的性能浪費
圖2.18 CPU、OpenGL/DirectX、顯卡驅動和GPU之間的關系
圖2.19 命令緩沖區。CPU通過圖像編程接口向命令緩沖區中添加命令,而GPU從中讀取命令並執行。黃色方框內的命令就是Draw Call,而紅色方框內的命令用於改變渲染狀態。我們使用紅色方框來表示改變渲染狀態的命令,
是因為這些命令往往更加耗時
圖2.20 命令緩沖區中的虛線方框表示GPU已經完成的命令。此時,命令緩沖區中沒有可以執行的命令了,GPU處於空閑狀態,而CPU還沒有准備好下一個渲染命令。
圖2.21 利用批處理,CPU在RAM把多個網格合並成一個更大的網格,再發送給GPU,然后在一個Draw Call中渲染它們。但要注意的是,使用批處理合並的網格將會使用同一種渲染狀態。也就是說,如果網格之間需要使用不同的渲染狀態,那么就無法使用批處理技術
第3章 Unity Shader基礎
圖3.1 Unity Shader和材質。首先創建需要的Unity Shader和材質,然后把Unity Shader賦給材質,並在材質面板上調整屬性(如使用的紋理、漫反射系數等)。最后,將材質賦給相應的模型來查看最終的渲染效果
圖3.2 將材質直接拖曳到模型的Mesh Renderer組件中
圖3.3 材質提供了一種可視化的方式來調整着色器中使用的參數
圖3.4 Unity Shader的導入設置面板
圖3.5 Gompile and show code下拉列表
圖3.6 Unity Shader為控制渲染過程提供了一層抽象。如果沒有使用Unity Shader(左圖),開發者需要和很多文件和設置打交道,才能讓畫面呈現出想要的效果;而在Unity Shader的幫助下(右圖),開發者只需要使用ShaderLab來編寫Unity Shader文件就可以完成所有的工作
圖3.7 在Unity Shader的名稱定義中利用
斜杠來組織在材質面板中的位置
圖3.8 不同屬性類型在材質
面板中的顯示結果
圖3.9 在Unity Shader的導入設置面板中可以通過Compile and show code按鈕來查看Unity對CG片段編譯后的代碼。通過單擊Compile and show code按鈕右端的倒三角可以打開下拉菜單,在這個下拉菜單中可以選擇編譯的平台種類,如只為當前的顯卡設備編譯特定的匯編代碼,或為所有的平台編譯匯編代碼,我們也可以自定義選擇編譯到哪些平台上
第4章 學習Shader所需的數學基礎
圖4.1 我們的農場游戲。我們的主角妞妞是一頭長得最壯、好奇心很強的奶牛
圖4.2 傳說,笛卡爾坐標系來源於笛卡爾對天花板上一只蒼蠅的運動軌跡的觀察。笛卡爾發現,可以使用蒼蠅距不同牆面的距離來描述它的當前位置
圖4.3 一個二維笛卡爾坐標系
圖4.4 在屏幕映射時,OpenGL和DirectX使用了不同方向的二維笛卡爾坐標系
圖4.5 笛卡爾坐標系可以讓妞妞精確表述自己的位置
圖4.6 一個三維笛卡爾坐標系
圖4.7 左手坐標系
圖4.8 右手坐標系
圖4.9 用左手法則和右手法則來判斷旋轉正方向
圖4.10 為了移動到新的位置,妞妞需要首先向某個方向平移1個單位,再向另一個方向平移4個單位,最后再向一個方向旋轉60°
圖4.11 左圖和右圖分別表示了在左手坐標系和右手坐標系中描述妞妞這次運動的結果,得到的數學描述是不同的
圖4.12 在模型空間和世界空間中,Unity使用的是左手坐標系。圖中,球的坐標軸顯示了它在模型空間中的3個坐標軸(紅色為x軸,綠色是y軸,藍色是z軸)
圖4.13 在Unity中,觀察空間使用的是右手坐標系,攝像機的前向是z軸的負方向,
z軸越小,物體的深度越大,離攝像機越遠
圖4.14 攝像機的位置是(0, 1, -10),球體的位置是(0, 1, 0)
圖4.15 一個二維向量以及它的頭和尾
圖4.16 點和矢量之間的關系
圖4.17 二維矢量和一些標量的乘法和除法
圖4.18 二維矢量的加法和減法
圖4.19 使用矢量減法來計算從點a到點b的位移
圖4.20 矢量的模
圖4.21 二維空間的單位矢量都會落在單位圓上
圖4.22 矢量b在單位矢量a方向上的投影
圖4.23 點積的符號
圖4.24 兩個單位矢量進行點積
圖4.25 三維矢量叉積的計算規律。不同顏色的線表示了計算結果矢量中對應顏色的分量的計算路徑。以紅色為例,即結果矢量的第一個分量,它是從第一個矢量的y分量出發乘以第二個矢量的z分量,再減去第一個矢量的z分量和第二矢量的y分量的乘積
圖4.26 使用矢量a和矢量b構建一個平行四邊形
圖4.27 分別使用左手坐標系和右手坐標系得到的叉積結果
圖4.28 使用右手法則判斷右手坐標系中a×b的方向
圖4.29 三角形的三個頂點位於xy平面上,人眼位於z軸負方向,向z軸正方向觀察
圖4.30 計算c23的過程
圖4.31 場景中的妞妞(左圖)和屏幕上的妞妞(右圖)。妞妞想知道,自己的鼻子是如何被畫到屏幕上的
圖4.32 在我們的農場游戲中,每個奶牛都有自己的模型坐標系。在模型坐標系中妞妞鼻子的位置是(0, 2, 4, 1)
圖4.33 Unity的Transform組件可以調節模型的位置.如果Transform有父節點,如圖中的“Mesh”,那么Position將是在其父節點(這里是“Cow”)的模型空間中的位置;如果沒有父節點,Position就是在世界空間中的位置
圖4.34 農場游戲中的世界空間。世界空間的原點被放置在農場的中心。左下角顯示了妞妞在世界空間中所做的變換。我們想要把妞妞的鼻子從模型空間變換到世界空間中
圖4.35 農場游戲中攝像機的觀察空間。觀察空間的原點位於攝像機處。注意在觀察空間中,攝像機的前向是z軸的負方向(圖中只畫出了z軸正方向),這是因為Unity在觀察空間中使用了右手坐標系。左下角顯示了攝像機在世界空間中所做的變換。我們想要把妞妞的鼻子從世界空間變換到觀察空間中
圖4.36 透視投影(左圖)和正交投影(右圖)。左下角分別顯示了當前攝像機的投影模式和相關屬性
圖4.37 視錐體和裁剪平面。左圖顯示了透視投影的視錐體,右圖顯示了正交投影的視錐體
圖4.38 透視攝像機的參數對透視投影視錐體的影響
圖4.39 在透視投影中,投影矩陣對頂點進行了縮放。圖3.38中標注了4個關鍵點經過投影矩陣變換后的結果。從這些結果可以看出x、y、z和w分量的范圍發生的變化
圖4.40 正交攝像機的參數對正交投影視錐體的影響
圖4.41 在正交投影中,投影矩陣對頂點進行了縮放。圖中標注了4個關鍵點經過投影矩陣變換后的結果。從這些結果可以看出x、y、z和w分量范圍發生的變化
圖4.42 農場游戲使用的攝像機參數和游戲畫面的橫縱比
圖4.43 經過齊次除法后,透視投影的裁剪空間會變換到一個立方體
圖4.44 經過齊次除法后,正交投影的裁剪空間會變換到一個立方體
圖4.45 渲染流水線中頂點的空間變換過程
圖4.46 Unity中各個坐標空間的旋向性
圖4.47 頂點的切線和法線。切線和法線互相垂直
圖4.48 進行非統一縮放時,如果使用和變換頂點相同的變換矩陣來變換法線,就會得到錯誤的結果,即變換后的法線方向與平面不再垂直
圖4.49 由片元的像素位置得到的圖像
圖4.50 圖中兩個坐標系的x軸和y軸是重合的,區別僅在於z軸的方向。左手坐標系的(0, 0, 1)點和右手坐標系中的(0, 0, 1)點是不同的,但它們旋轉后的點卻對應到了同一點
圖4.51 絕對空間中的同一點,在左手和右手坐標系中進行同樣角度的旋轉,其旋轉方向是不一樣的。在左手坐標系中將按順時針方向旋轉,在右手坐標系中將按逆時針方向旋轉
圖4.52 在左手坐標系中,如果叉積結果為負,那么3點的順序是順時針方向
第5章 開始Unity Shader學習之旅
圖5.1 在Unity 5中新建一個場景得到的效果
圖5.2 用一個最簡單的頂點/片元着色器得到一個白色的球
圖5.3 Unity的內置着色器
圖5.4 用假彩色對Unity Shader進行調試
圖5.5 使用顏色拾取器來查看調試信息
圖5.6 幀調試器
圖5.7 單擊Knot的深度圖渲染事件,在Game視圖會顯示該事件的效果,在Hierarchy視圖中會高亮顯示Knot對象,在幀調試器的右側窗口會顯示出該事件的細節
圖5.8 OpenGL和DirectX使用了不同的屏幕空間坐標
第6章 Unity中的基礎光照
圖6.1 在左圖中,光是垂直照射到物體表面,因此光線之間的垂直距離保持不變;而在右圖中,光是斜着照射到物體表面,在物體表面光線之間的距離是d/cosθ,因此單位面積上接收到的光線數目要少於左圖
圖6.2 散射時,光線會發生折射和反射現象。對於不透明物體,折射的光線會在物體內部繼續傳播,最終有一部分光線會重新從物體表面被發射出去
圖6.3 使用Phong模型計算高光反射
圖6.4 Blinn模型
圖6.5 在Unity的Window -> Lighting面板中,我們可以通過Ambient Source/Ambient Color/Ambient Intensity來控制場景中的環境光的顏色和強度
圖6.6 逐頂點的漫反射光照效果
圖6.7 逐像素的漫反射光照效果
圖6.8 逐頂點漫反射光照、逐像素漫反射光照、半蘭伯特光照的對比效果
圖6.9 CG的reflect函數
圖6.10 逐頂點的高光反射光照效果
圖6.11 逐像素的高光反射光照效果
圖6.12 逐頂點的高光反射光照、逐像素的高光反射光照(Phong光照模型)和Blinn-Phong高光反射光照的對比結果
第7章 基礎紋理
圖7.1 Unity中的紋理坐標
圖7.2 使用單張紋理
圖7.3 調節紋理的平鋪(縮放)和偏移(平移)屬性
圖7.4 紋理的屬性
圖7.5 Wrap Mode決定了當紋理坐標超過[0, 1]范圍后將會如何被平鋪
圖7.6 偏移(Offset)屬性決定了紋理坐標的偏移量
圖7.7 在放大紋理時,分別使用三種Filter Mode得到的結果
圖7.8 在Advanced模式下可以設置多級漸遠紋理的相關屬性
圖7.9 從上到下: Point濾波 + 多級漸遠紋理技術,Bilinear濾波 + 多級漸遠紋理技術,Trilinear濾波 + 多級漸遠紋理技術
圖7.10 選擇紋理的最大尺寸和紋理模式
圖7.11 高度圖
圖7.12 模型頂點的切線空間。其中,原點對應了頂點坐標,x軸是切線方向(t),y軸是副切線方向(b),z軸是法線方向(n)
圖7.13 左圖:模型空間下的法線紋理。右圖:切線空間下的法線紋理
圖7.14 使用法線紋理
圖7.15 使用Bump Scale屬性來調整模型的凹凸程度
圖7.16 當使用UnpackNormal函數計算法線紋理中的法線方向時,需要把紋理類型標識為Normal map
圖7.17 當勾選了Create from Grayscale后,Unity會根據高度圖來生成一張切線空間下的法線紋理
圖7.18 使用不同的漸變紋理控制漫反射光照,左下角給出了每張圖使用的漸變紋理
圖7.19 Wrap Mode分別為Repeat和Clamp模式的效果對比
圖7.20 使用高光遮罩紋理。從左到右:只包含漫反射,未使用遮罩的高光反射,使用遮罩的高光反射
圖7.21 本節使用的高光遮罩紋理
第8章 透明效果
圖8.1 場景中有兩個物體,其中A(黃色)是半透明物體,B(紫色)是不透明物體
圖8.2 場景中有兩個物體,其中A和B都是半透明物體
圖8.3 循環重疊的半透明物體總是無法得到正確的半透明效果
圖8.4 使用哪個深度對物體進行排序。紅色點分別標明了網格上距離攝像機最近的點、最遠的點以及網格中點
圖8.5 一張透明紋理,其中每個方格的透明度都不同
圖8.6 透明度測試
圖8.7 隨着Alpha cutoff參數的增大,更多的像素由於不滿足透明度測試條件而被剔除
圖8.8 透明度混合
圖8.9 隨着Alpha Scale參數的增大,模型變得越來越透明
圖8.10 當模型網格之間有互相交叉的結構時,往往會得到錯誤的半透明效果
圖8.11 開啟了深度寫入的半透明效果
圖8.12 不同混合狀態設置得到的效果
圖8.13 雙面渲染的透明度測試的物體
圖8.14 雙面渲染的透明度混合的物體
第9章 更復雜的光照
圖9.1 設置Unity項目的渲染路徑
圖9.2 攝像機組件的Rendering Path中的設置可以覆蓋Project Settings中的設置
圖9.3 設置光源的類型和渲染模式
圖9.4 前向渲染的兩種Pass
圖9.5 平行光
圖9.6 點光源
圖9.7 開啟Scene視圖中的光照
圖9.8 聚光燈
圖9.9 使用一個平行光和一個點光源共同照亮物體。右圖顯示了膠囊體、平行光和點光源在場景中的相對位置
圖9.10 使用1個平行光 + 4個點光源照亮一個物體
圖9.11 打開幀調試器查看場景的繪制事件
圖9.12 本例中的6個渲染事件,繪制順序是從左到右、從上到下進行的
圖9.13 如果物體不在一個光源的光照范圍內(從右圖可以看出,膠囊體不在最左方的點光源的照明范圍內),Unity是不會調用Additional Pass來為該物體處理該光源的
圖9.14 當把光源的Render Mode設為Not Important時,這些光源就不會按逐像素光來處理
圖9.15 開啟光源的陰影效果
圖9.16 Mesh Renderer組件的Cast Shadows和Receive Shadows屬性可以控制該物體是否投射/接收陰影
圖9.17 開啟Cast Shadows和Receive Shadows,從而讓正方體可以投射和接收陰影
圖9.18 把Cast Shadows設置為Two Sided可以讓右側平面的背光面也產生陰影
圖9.19 正方體可以接收來自右側平面的陰影
圖9.20 使用幀調試器查看陰影繪制過程
圖9.21 正方體對深度紋理的更新結果
圖9.22 屏幕空間的陰影圖
圖9.23 Unity繪制屏幕陰影的過程
圖9.24 可以投射陰影的使用透明度測試的物體
圖9.25 正確設置了Fallback的使用透明度測試的物體
圖9.26 正確設置了Cast Shadow屬性的使用透明度測試的物體
圖9.27 把使用了透明度混合的Unity Shader的Fallback設置為內置的Transparent/VertexLit。半透明物體不會向下方的平面投射陰影,也不會接收來自右側平面的陰影,它看起來就像是完全透明一樣
圖9.28 把Fallback設為VertexLit來強制為半透明物體生成陰影
第10章 高級紋理
圖10.1 對立方體紋理的采樣
圖10.2 天空盒子材質
圖10.3 為場景使用自定義的天空盒子
圖10.4 使用了天空盒子的場景
圖10.5 使用腳本創建立方體紋理
圖10.6 使用腳本渲染立方體紋理
圖10.7 使用了反射效果的Teapot模型
圖10.8 斯涅爾定律
圖10.9 使用了折射效果的Teapot模型
圖10.10 使用了菲涅耳反射的Teapot模型
圖10.11 鏡子效果
圖10.12 左圖:把攝像機的Target Texture設置成自定義的渲染紋理。右圖:渲染紋理使用的紋理設置
圖10.13 玻璃效果
圖10.14 本例使用的立方體紋理
圖10.15 腳本生成的程序紋理
圖10.16 調整程序紋理的參數來得到不同的程序紋理
圖10.17 后綴為.sbsar的Substance材質
圖10.18 程序紋理資源
圖10.19 調整程序紋理屬性可以得到看似完全不同的程序材質效果
第11章 讓畫面動起來
圖11.1 本節使用的序列幀圖像
圖11.2 使用序列幀動畫來實現爆炸效果
圖11.3 無限滾動的背景(紋理來源:forest-background © 2012-2013 Julien Jorge julien.jorge@stuff-o-matic.com)
圖11.4 使用頂點動畫來模擬2D的河流
圖11.5 法線固定(總是指向視角方向)時,計算廣告牌技術中的三個正交基的過程
圖11.6 廣告牌效果。左圖顯示了攝像機和5個廣告牌之間的位置關系,攝像機是從斜上方向下觀察它們的。中間的圖顯示了當Vertical Restraints屬性為1,即固定法線方向為觀察視角時所得到的效果,可以看出,所有的廣告牌都完全面朝攝像機。右圖顯示了當Vertical Restraints屬性為0,即固定指向上的方向為(0, 1, 0)時所得到的效果,可以看出,廣告牌雖然最大限度地面朝攝像機,但其指向上的方向並未發生改變
圖11.7 當進行頂點動畫時,如果仍然使用內置的ShadowCaster Pass來渲染陰影,可能會得到錯誤的陰影效果
圖11.8 使用自定義的ShadowCaster Pass
為變形物體繪制正確的陰影
第12章 屏幕后處理效果
圖12.1 左圖:原效果。右圖:調整了亮度(值為1.2)、飽和度(值為1.6)和對比度(值為1.2)后的效果
圖12.2 為腳本設置Shader的默認值
圖12.3 左圖:12.2節得到的結果。
右圖:進行邊緣檢測后的效果
圖12.4 卷積核與卷積。使用一個3×3大小的卷積核對一張5×5大小的圖像進行卷積操作,當計算圖中紅色方塊對應的像素的卷積結果時,我們首先把卷積核的中心放置在該像素位置,翻轉核之后再依次計算核中每個元素和其覆蓋的圖像像素值的乘積並求和,得到新的像素值
圖12.5 三種常見的邊緣檢測算子
圖12.6 只顯示邊緣的屏幕效果
圖12.7 左圖:原效果。右圖:高斯模糊后的效果
圖12.8 一個5×5大小的高斯核。左圖顯示了標准方差為1的高斯核的權重分布。我們可以把這個二維高斯核拆分成兩個一維的高斯核(右圖)
圖12.9 動畫短片《大象之夢》中的Bloom效果。光線透過門擴散到了周圍較暗的區域中
圖12.10 左圖:原效果。右圖:Bloom處理后的效果
圖12.11 左圖:原效果。右圖:應用運動模糊后的效果
第13章 使用深度和法線紋理
圖13.1 在透視投影中,投影矩陣首先對頂點進行了縮放。在經過齊次除法后,透視投影的裁剪空間會變換到一個立方體。圖中標注了4個關鍵點經過投影矩陣變換后的結果
圖13.2 在正交投影中,投影矩陣對頂點進行了縮放。在經過齊次除法后,正交投影的裁剪空間會變換到一個立方體。圖中標注了4個關鍵點經過投影矩陣變換后的結果
圖13.3 使用Frame Debugger查看深度紋理(左)和深度+法線紋理(右)。如果當前攝像機需要生成深度和法線紋理,幀調試器的面板中就會出現相應的渲染事件。只要單擊對應的事件就可以查看得到的深度和法線紋理
圖13.4 左圖:線性空間下的深度紋理。右圖:解碼后並且被映射到[0, 1]范圍內的視角空間下的法線紋理
圖13.5 左圖:原效果。右圖:添加全局霧效后的效果
圖13.6 計算interpolatedRay
圖13.7 采樣得到的深度值並非是點到攝像機的歐式距離
圖13.8 左圖:原效果。右圖:直接對顏色圖像進行邊緣檢測的結果
圖13.9 在深度和法線紋理上進行更健壯的邊緣檢測。左圖:在原圖上描邊的效果。右圖:只顯示描邊的效果
圖13.10 Roberts算子
第14章 非真實感渲染
圖14.1 游戲《大神》(英文名:Okami)的游戲截圖
圖14.2 卡通風格的渲染效果
圖14.3 左圖:未對高光區域進行抗鋸齒處理。右圖:使用fwidth函數對高光區域進行抗鋸齒處理
圖14.4 一個TAM的例子(來源:Praun E, et al. Real-time hatching4)
圖14.5 素描風格的渲染效果
第15章 使用噪聲
圖15.1 箱子的消融效果
圖15.2 消融效果使用的噪聲紋理
圖15.3 包含菲涅耳反射的水面波動效果。在左圖中,視角方向和水面法線的夾角越大,反射效果越強。在右圖中,視角方向和水面法線的夾角越大,折射效果越強
圖15.4 本例使用的立方體紋理
圖15.5 水波效果使用的噪聲紋理。左圖:噪聲紋理的灰度圖。右圖:由左圖生成的法線紋理
圖15.6 左圖:均勻霧效。右圖:使用噪聲紋理后的非均勻霧效
圖15.7 本節使用的噪聲紋理
第16章 Unity中的渲染優化技術
圖16.1 Unity 5的渲染統計窗口
圖16.2 使用Unity的性能分析器中的渲染區域來查看更多關於渲染的統計信息
圖16.3 使用幀調試器來查看單獨的draw call的繪制結果
圖16.4 動態批處理
圖16.5 多光源對動態批處理的影響結果
圖16.6 靜態批處理前的渲染統計數據
圖16.7 把物體標志為Static
圖16.8 靜態批處理
圖16.9 靜態批處理中Unity會合並所有被標識為“Static”的物體
圖16.10 靜態批處理會占用更多的內存。左圖:靜態批處理前的渲染統計數據。右圖:靜態批處理后的渲染統計數據
圖16.11 處理其他逐像素光的Pass不會被靜態批處理
圖16.12 Unity的高級紋理設置面板
第17章 Surface Shader探秘
圖17.1 表面着色器的例子。左圖:在一個平行光下的效果。右圖:添加了一個點光源(藍色)和一個聚光燈(紫色)后的效果
圖17.2 查看表面着色器生成的代碼
圖17.3 表面着色器的渲染計算流水線。黃色:可以自定義的函數。灰色:Unity自動生成的計算步驟
圖17.4 沿頂點法線對模型進行膨脹。左圖:膨脹前。右圖:膨脹后
第18章 基於物理的渲染
圖18.1 在理想的邊界處,折射率的突變會把光線分成兩個方向
圖18.2 左圖:光滑表面的微平面的法線變化較小,反射光線的方向變化也更小。
右圖:粗糙表面的微平面的法線變化較大,反射光線的方向變化也更大
圖18.3 微表面對光的折射。這些被折射的光中一部分被吸收,一部分又被散射到外部
圖18.4 次表面散射。左圖:次表面散射的光線會從不同於入射點的位置射出。如果這些距離值小於需要被着色的像素大小,那么渲染就可以完全在局部完成(右圖)。否則,就需要使用次表面散射渲染技術
圖18.5 BRDF描述的兩種現象。高光反射部分用於描述反射,漫反射部分用於描述次表面散射
圖18.6 (a)那些m=h的微面元會恰好把入射光從I反射到v上,只有這部分微面元才可以添加到BRDF的計算中。(b)一部分滿足(a)的微面元會在I方向上被其他微面元遮擋住,它們不會接受到光照,因此會形成陰影。(c)還有一部分滿足(a)的微面元會在反射方向v上被其他微面元擋住,因此,這部分反射光也不會被看到
圖18.7 Standard Shader中前向渲染路徑使用的Pass(簡化版本的PBS使用了VertexOutputBaseSimple等結構體來代替相應的結構體)
圖18.8 Unity提供的校准表格。左圖:金屬工作流
使用的校准表格。右圖:高光反射工作流使用的校准表格
圖18.9 使用金屬工作流來實現不同類型的材質。左邊的球體:金屬材質。右邊的球體:塑料材質
圖18.10 在Unity 5中使用基於物理的渲染技術,場景在不同光照下的渲染結果
圖18.11 光照面板下的Scene標簽頁
圖18.12 左圖:當關閉場景中的所有光源並把環境光照強度設為0后,使用了Standard Shader的物體仍然具有光照效果。右圖:在左圖的基礎上,把反射源設置為空,使得物體不接受任何默認的反射信息
圖18.13 使用的平行光
圖18.14 左圖:將Bounce Intensity設置為0,物體不再受到間接光照的影響,木屋內陰影部分的可見細節很少。右圖:將Bounce Intensity設為8,陰影部分的細節更加清楚
圖18.15 左圖:未使用反射探針。右圖:在場景中放置了兩個反射探針,注意牆上的盾牌與左圖的差別
圖18.16 使用反射探針實現相互反射的效果
圖18.17 左圖:在線性空間下的渲染結果。右圖:在伽馬空間下的渲染結果
圖18.18 人眼更容易感知暗部區域的變換,而對較亮區域的變化比較不敏感
圖18.19 編碼伽馬和顯示伽馬
圖18.20 左圖:伽馬空間下的渲染結果。右圖:線性空間下的渲染結果
圖18.21 左圖:伽馬空間下的混合結果。右圖:線性空間下的混合結果
第19章 Unity 5更新了什么
圖19.1 在shader的導入面板中,單擊圖中按鈕可查看Unity為該固定管線着色器生成的頂點/片元着色器代碼