Unity Shader入門精要讀書筆記(一)序章

本系列的博文是筆者讀《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將渲染狀態準備好後,經過調用DrawCallGPU進行渲染,若是一直不改動此渲染狀態,那麼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.OpenGLUnityNDC中的z份量是-11的,而DX01的;

33.NDC單位立方體內進行裁剪時,在視野內的部分保留,於是可能產生新頂點,效果以下:

 

 

34.裁剪是硬件決定的,沒法編程;

35.屏幕映射將圖元的xy轉換到屏幕座標系下,屏幕映射不處理zz和映射後的xy合稱窗口座標系;

 

 

36.DX的屏幕座標系原點在左上角(和UE同樣),OpenGL的原點在左下角;

37.通過了幾何階段的屏幕映射的處理,將會傳來關於頂點的額外信息如深度值,法線,視角方向等;

38.光柵化的兩個重要目標:a圖元覆蓋了哪些像素,b計算這些像素的顏色;

39.三角形設置是爲了計算三角形三條邊處在哪些像素上的;

40.三角形遍歷是爲了計算某一個像素是否被一個三角形覆蓋,若是是的話,這些像素稱爲「片元」fragment,這個遍歷過程也稱爲掃描變換;注意片元和像素並不徹底一致;

41.在全部的量上,好比深度、顏色等,爲片元進行插值計算;

42.片元着色器接受三角形遍歷獲得的對頂點插值的結果,輸出是一個或者多個顏色值;

43.片元着色器還可以完成重要的渲染技術如紋理採樣;

44.真正對像素產生影響的階段是逐片元操做;

45.逐片元操做PerFragmentOperationsOpenGL的說法,在DX中稱爲OutputMerger輸出合併階段;

46.逐片元操做a決定每一個片元的可見性,如深度測試等,b將片元和已經儲存在顏色緩衝區的顏色進行合併,或者說混合;

47.逐片元操做是可配置的;

48.逐片元操做的流程:片元》模板測試》深度測試》混合》顏色緩衝區;

49.模板測試是自定義的測試,當一個片元的某個指標值和緩衝區中的此指標值作比較,經過測試的話,就能夠進入下一個測試,沒有經過的話就被捨棄;無論有沒有經過,均可以設置緩衝區中的指標值;

50.深度測試經常用來作先後遮擋的測試,如當前片元的深度比緩衝區中的深度小(靠近屏幕),那麼它就經過測試,並有權利修改緩衝區中的深度指標;

51.經過了全部測試的進入混合操做,若是沒有開啓混合(也就是徹底遮擋的),那麼直接使用該片元的顏色,更新到緩衝區中的顏色值;若是開啓了的話,將緩衝區和本片元的顏色作一個數學運算獲得新值寫入給緩衝區;

52.逐片元操做中的測試每每會被移到更加早的步驟上進行測試,爲了節省計算;深度測試提前作,EarlyZ技術;

53.避免咱們看到光柵化中的圖像,將會進行雙重緩衝,即當下一幀畫面的內容準備好後,才登上屏幕;

54.OpenGLDX是計算機圖像的API,由APP調用,GLDX則會去調用顯卡驅動,顯卡驅動真正去調用硬件設備;

55.SL着色語言是用來編寫着色器代碼的,從而避免寫彙編語句,HLSLDX的着色語言,GLSLOpenGL的着色語言,CGC for Graphic)是NVIDIA的着色語言;

56.UnityShader語言和CGHLSLGLSL不徹底同樣是着色器語言;

57.CPUGPU是如何一塊兒工做的?有一個命令緩衝隊列,CPU向其中塞入命令如DrawCall或者改變渲染狀態,而GPU則是從中獲取命令並執行;

58.渲染速度每每快於提交命令的速度,也就是說CPU提交DrawCall數目太多將會致使效率低(複製100001kb文件和複製一個10M文件的比喻,即提交大量很小的DrawCall會致使效率低下);

59.如何減小DrawCall?儘可能讓一次DrawCall作不少活,也就是批處理思想;

60.固定函數流水線也稱爲固定管線,一般指在較舊的GPU上實現的渲染流水線;(只能夠配置而不能夠徹底控制,就好像只能使用開關控制而不能修改佈局的電路);注:管線是管道線的簡稱,也就是封閉的流水線,沒法徹底操控內部;

61.ShaderGPU流水線上一些課高度編程的階段,最終代碼在GPU上運行,有特定類型的着色器(頂點着色器、片元着色器),利用着色器控制流水線中的渲染細節如頂點着色器進行變換等;

相關文章
相關標籤/搜索