本系列的博文是筆者讀《Unity Shader入門精要》的讀書筆記,這本書的章節框架是:算法
第一章:着手準備。編程
第二章:GPU流水線。框架
第三章:Shader基本語法。函數
第四章:Shader數學基礎。佈局
第五章:利用簡單的頂點/片元着色器來實現輔助技巧。測試
第六章:基本光照模型。優化
第七章:法線紋理、遮罩紋理等基礎紋理。動畫
第八章:透明度測試和透明度混合。spa
第九章:複雜光照實現。blog
第十章:高級紋理(立方體紋理等)。
第十一章:紋理動畫、頂點動畫。
第十二章:屏幕特效。
第十三章:深度紋理。
第十四章:非真實感的渲染算法。
第十五章:噪聲在遊戲渲染中的應用。
第十六章:優化技巧。
第十七章:表面着色器實現渲染。
第十八章:物理渲染技術。
第十九章:Unity5中的可能出現的問題。
第二十章:更深刻的大門。
本書的主旨:原理+使用技巧。
第一篇的筆記:
第二篇到第四篇沒有動手編程,都是理論知識。
第二篇《渲染流水線》的筆記:
1.渲染流水線是爲了在屏幕上渲染二維圖像;
2.渲染流水線的輸入是虛擬攝像機、光源、shader和紋理;
3.渲染流程的三個階段:應用階段、幾何階段、光柵化階段;
4.應用階段是CPU負責實現的,開發者主導此階段;
5.開發者在應用階段下的任務有:a準備好場景如攝像機的位置和朝向、光源等,b粗粒度剔除工做,是爲了將不可見的物體剔除,不讓它們傳到幾何階段,c設置好每個模型的渲染狀態如材質、紋理、shader等;
6.渲染圖元包括點、線、三角面等須要被繪製的幾何信息;
7.幾何階段在GPU上進行,它決定圖元以何種方式繪製,在哪裏繪製等,和每個渲染圖元打交道,輸入的渲染圖元通過多步處理後,輸出屏幕空間中的而爲頂點座標、深度值、着色細節等信息;
8.光柵化階段是爲了利用上一個階段產生的信息產生屏幕上的像素,渲染出最終圖像的,在GPU上進行本階段。對頂點的數據進行插值,獲得最終的像素。
9.三個階段都會有更加細的流水線劃分;
10.CPU是渲染流水線的起點;
11.應用階段a將數據加載到顯存中,b設置渲染狀態(也就是shader、紋理等),c調用drawcall;
12.渲染所需數據從硬盤HDD加載到內存RAM中,再被加載到顯存VRAM中;
13.顯卡對顯存的訪問更加快,比起對內存,更不用說比起HDD;
14.渲染狀態規定了場景中的網格是如何被渲染的,例如使用了何種頂點着色器(VertexShader)片元着色器(FragmentShader)、光源屬性和材質等;
15.CPU將渲染狀態準備好後,經過調用DrawCall讓GPU進行渲染,若是一直不改動此渲染狀態,那麼GPU將會一直以這個渲染狀態來進行繪製;
16.DrawCall的調用不須要指定任何材質信息(緣由上一點也說了),一次DrawCall命令針對一個圖元Primitives的列表;
17.頂點數據由CPU加載到顯存上去,而後DrawCall交由頂點着色器處理;
18.頂點着色器徹底可編程,一般爲頂點作空間變換,頂點着色等功能;
19.曲面細分着色器用於細分圖元;
20.幾何着色器用於逐圖元着色,或者用於產生更多的圖元;
21.裁剪將再也不攝像機內的頂點裁掉,剔除某些三角形面;
22.屏幕映射將圖元的座標切換到屏幕座標系下;
23.幾何階段的流水線爲:頂點數據》頂點着色器》曲面細分着色器(可選)》幾何着色器(可選)》裁剪》屏幕映射;
24.片元着色器能夠編程,負責逐片元操做,逐片元操做爲了執行顏色修改、深度緩衝、混合等,逐片元操做是可配置而不可編程的;
25.光柵化階段的流水線是:三角形設置》三角形遍歷》片元着色器》逐片元操做;
26.頂點着色器處理單元是頂點,每進來一個頂點就會調用一次頂點着色;
27.頂點着色器自己不知道頂點之間的拓撲關係,也不銷燬或建立頂點;
28.頂點着色器可以並行處理頂點,由於頂點之間相互獨立;
29.頂點着色器主要完成座標變換和逐頂點光照計算;
30.頂點着色器必需要完成的一個工做:把頂點座標從模型空間轉換到齊次裁剪空間,這個空間是視野空間,這個空間也是爲了作裁剪運算的,好比把不在(-1,-1,-1)到(1,1,1)裏的點裁剪掉;
31.術語:歸一化設備座標NDC;
32.OpenGL和Unity的NDC中的z份量是-1到1的,而DX是0到1的;
33.在NDC單位立方體內進行裁剪時,在視野內的部分保留,於是可能產生新頂點,效果以下:
34.裁剪是硬件決定的,沒法編程;
35.屏幕映射將圖元的x和y轉換到屏幕座標系下,屏幕映射不處理z,z和映射後的xy合稱窗口座標系;
36.DX的屏幕座標系原點在左上角(和UE同樣),OpenGL的原點在左下角;
37.通過了幾何階段的屏幕映射的處理,將會傳來關於頂點的額外信息如深度值,法線,視角方向等;
38.光柵化的兩個重要目標:a圖元覆蓋了哪些像素,b計算這些像素的顏色;
39.三角形設置是爲了計算三角形三條邊處在哪些像素上的;
40.三角形遍歷是爲了計算某一個像素是否被一個三角形覆蓋,若是是的話,這些像素稱爲「片元」fragment,這個遍歷過程也稱爲掃描變換;注意片元和像素並不徹底一致;
41.在全部的量上,好比深度、顏色等,爲片元進行插值計算;
42.片元着色器接受三角形遍歷獲得的對頂點插值的結果,輸出是一個或者多個顏色值;
43.片元着色器還可以完成重要的渲染技術如紋理採樣;
44.真正對像素產生影響的階段是逐片元操做;
45.逐片元操做PerFragmentOperations是OpenGL的說法,在DX中稱爲OutputMerger輸出合併階段;
46.逐片元操做a決定每一個片元的可見性,如深度測試等,b將片元和已經儲存在顏色緩衝區的顏色進行合併,或者說混合;
47.逐片元操做是可配置的;
48.逐片元操做的流程:片元》模板測試》深度測試》混合》顏色緩衝區;
49.模板測試是自定義的測試,當一個片元的某個指標值和緩衝區中的此指標值作比較,經過測試的話,就能夠進入下一個測試,沒有經過的話就被捨棄;無論有沒有經過,均可以設置緩衝區中的指標值;
50.深度測試經常用來作先後遮擋的測試,如當前片元的深度比緩衝區中的深度小(靠近屏幕),那麼它就經過測試,並有權利修改緩衝區中的深度指標;
51.經過了全部測試的進入混合操做,若是沒有開啓混合(也就是徹底遮擋的),那麼直接使用該片元的顏色,更新到緩衝區中的顏色值;若是開啓了的話,將緩衝區和本片元的顏色作一個數學運算獲得新值寫入給緩衝區;
52.逐片元操做中的測試每每會被移到更加早的步驟上進行測試,爲了節省計算;深度測試提前作,EarlyZ技術;
53.避免咱們看到光柵化中的圖像,將會進行雙重緩衝,即當下一幀畫面的內容準備好後,才登上屏幕;
54.OpenGL和DX是計算機圖像的API,由APP調用,GL和DX則會去調用顯卡驅動,顯卡驅動真正去調用硬件設備;
55.SL着色語言是用來編寫着色器代碼的,從而避免寫彙編語句,HLSL是DX的着色語言,GLSL是OpenGL的着色語言,CG(C for Graphic)是NVIDIA的着色語言;
56.UnityShader語言和CG、HLSL和GLSL不徹底同樣是着色器語言;
57.CPU和GPU是如何一塊兒工做的?有一個命令緩衝隊列,CPU向其中塞入命令如DrawCall或者改變渲染狀態,而GPU則是從中獲取命令並執行;
58.渲染速度每每快於提交命令的速度,也就是說CPU提交DrawCall數目太多將會致使效率低(複製10000個1kb文件和複製一個10M文件的比喻,即提交大量很小的DrawCall會致使效率低下);
59.如何減小DrawCall?儘可能讓一次DrawCall作不少活,也就是批處理思想;
60.固定函數流水線也稱爲固定管線,一般指在較舊的GPU上實現的渲染流水線;(只能夠配置而不能夠徹底控制,就好像只能使用開關控制而不能修改佈局的電路);注:管線是管道線的簡稱,也就是封閉的流水線,沒法徹底操控內部;
61.Shader是GPU流水線上一些課高度編程的階段,最終代碼在GPU上運行,有特定類型的着色器(頂點着色器、片元着色器),利用着色器控制流水線中的渲染細節如頂點着色器進行變換等;