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