Draw Call:理解為一個命令,由CPU發起,GPU接收,命令指向一個需要被渲染的圖元列表,計算數據后輸出為像素
頂點著色器:每個定點都會調用一次,完成坐標的變換(將定點坐標從模型空間轉換到其次裁剪空間)和逐定點的光照。
三角形設置:由得到的信息計算每個圖元覆蓋的像素,計算像素的顏色
三角形遍歷:檢查每個像素是否被一個三角網格覆蓋。被覆蓋則生成一個片元(片元并不是真正意義上的像素)
片元著色器(像素著色器):進行逐片元的操作,輸入的是對頂點著色器輸出的信息插值得到的結果(為了在片元著色器中進行紋理采樣,通常在定點著色器階段輸出每個頂點對應的紋理坐標)
逐片元操作:決定片元的可見性,混合顏色信息
HLSL(DirectX):High Level Shading Language
Cg(Nvidia):C for Graphic
GLSL(OpenGL):OpenGL Shading Language
DrawCall數量影響:DrawCall之前CPU向GPU提交數據,DrawCall多時,過多的CPU提交數據造成CPU過載
Unity Shader:用ShaderLab編寫,ShaderLab是Unity提供的編寫UnityShader的一種說明性語言
通過Shader名稱的字符串中添加'/'修改對應Shader出現在菜單中的位置
Properties:用于包含需要顯示在Inspector面板中的屬性的語義塊
\\ Example
Properties{
Name("display name", PropertyType) = DefaultValue
}
SubShader:
- 一個Shader中至少包含一個SubShader
- Unity會選擇第一個可以在當前平臺使用的SubShader,都不行的話使用Fallback指定的UnityShader
- SubShader中會定義一系列的Pass,RenderSetup,Tags
常見渲染狀態:
- Cull:設置剔除模式,背面(Back),證明(Front),關閉(Off)
- ZTest:設置深度測試使用函數
- ZWrite:開啟和關閉深度寫入
- Blend:開啟并設置混合模式
Pass語義塊:
- 通過Name "MyPassName"命名,從而實現復用
- 復用使用UsePass "MyShader/MYPASSNAME",PassName部分要使用全大寫
Fallback:如果所有的SubShader都用不了的話就使用Fallback提供備選的Shader
表面著色器(Surface Shader):
- 需要代碼量少,但是渲染代價比較大
- 處理很多光照細節
頂點/片元著色器(Vertex/Fragment Shader):
- 代碼復雜但是靈活度高
- 代碼寫在Pass語義塊內,自己定義每個Pass的Shader代碼
Unity Shader并非是真正的Shader
- Unity里,Unity Shader指的只是一個ShaderLab文件
- Unity Shader可以同時編寫頂點著色器和片元著色器
- 本質上說Unity中只存在定點/片元著色器
Unity中的笛卡爾坐標系
- 對于模型空間和世界空間,使用的是左手系
- 觀察空間使用的是右手系
點(Point):維度空間里面的一個位置,主要為二維空間或者三維空間
矢量(vector):包含了模和方向的有向線段,小寫粗體表示,通常用于相對于某個點的偏移
單位矢量:模為1的矢量,也稱為歸一化的矢量,將矢量轉化成單位矢量的過程叫做歸一化,單位矢量使用小寫粗體字符上添加'^'表示
矢量的點積:
- 也稱為內積
- dot(a,b)表示兩個矢量的點積,計算為矢量對應的分量分別相乘。
- 點積的其中一個幾何意義就是投影,一個矢量a點積一個矢量b,除以a模則是b在a上的投影,除以b的模則是a在b方向上的投影
- 正負表示與單位矢量a方向相同或者相反
- 一個矢量與自身進行點積,結果是矢量模的平方
- 兩個單位矢量的點積是對應的余弦值
矢量的叉積:
- 也成為矢量的外積
- 計算的結果仍然是一個矢量
- axb = (aybz - azby, azbx - axbz, axby - aybx),計算的角標是按照xyz連續相鄰
- 不滿足交換率
- 點積的向量的長度為a的模和b的模乘以sin夾夾角值
- 左手系和右手系不會對計算結果產生影響,影響的知識三維空間中視覺表現
矩陣(Matrix):
- 由mxn個標量組成的長方形數組
- 矩陣乘法滿足結合率不滿足交換率
方塊矩陣:
- 簡稱方陣,行數和列數相等的矩陣
- 有對角元素,對角元素為行數和列數相等的元素
對角矩陣:
- 對角矩陣是除了對角元素外都為0的對角矩陣
單位矩陣:
- 將原矩陣的第i行變成了第i列,即為轉置矩陣
逆矩陣:
- 矩陣可逆的前提是方塊矩陣
- 如果矩陣有逆矩陣則說矩陣可逆
- 矩陣的行列式不為0,則矩陣可逆
- 轉置矩陣的逆矩陣是逆矩陣的轉置
正交矩陣:
如果一個方陣和其轉置矩陣的相乘為單位矩陣則為正交矩陣