新生活運動實施中,
晚上1點上床睡覺,早上9點起床。
起床-下午:讀書下午-晚上:做專案晚上-睡前:創作 or 讀書 or 做專案
大腦只能有程式、星爆、英日文。沒做到我就要請朋友喝飲料了。
可以直接看Notion筆記: 連結

- Vertex Shader (單個頂點,不知道點線面的資訊)
- Tessellation Shader (曲面細分,增加更多面數細節,使模型套用displacement等資訊能更圓滑 [3])
- Geometry Shader ( 知道並負責編輯點線面的資訊)
- Fragment Shader (畫面上每個像素)
- Frame Buffer
- 常見的Render Path。
- 光的數量和複雜度成線性增長,所以Unity只考慮重要程度最大的4個光源(預設)。
- 在Vertex shader 或 fragment shader計算光源。
- 若一個1920*1080解析度的畫面有1000個頂點的模型、n個光源,則逐點光複雜度為1000n;
逐像素光則是1920*1080*n。頂點數量<像素數量,盡量使用逐頂點光。(?- 在這裡我有個疑問,若在1024*768的解析度上有10個100萬vertex的模型,請問該使用哪個shader計算光源?
逐頂點光Shader
逐像素光Shader,註解掉的地方是逐頂點光的程式碼
Deferred Render (延遲渲染)
- 光照處理延遲到
clip spacescreen space(2D)再進行。 - 需要G-Buffer儲存每個像素的Position、Normal、Diffuse和其他材質資訊,產生紋理圖。
- 優勢: 將光源數目與物體數目複雜度完全分開。(Light Culling [4]:只處理在範圍內的光線)。
- 劣勢: G-Buffer消耗顯卡內存多、存取耗費頻寬大。
優化方式(1): Light Pre-Pass:
- G-Buffer只儲存Z值、Normal。 (縮小G-Buffer數據結構)。
- 在Fragment shader利用G-Buffer先計算出Light properties,進行alpha-blend後存入LightBuffer。
- 最後結果送給Forward Render輸出。
- 優點是每個物體能使用不同效果的Shader進行渲染。
優化方式(2): Tile-Based Deferred Render:
- 將螢幕分成許多小區塊(tile),一個個處理後重組。一般Tile 是32*32像素[4]。
- 常用於手機遊戲,因為手機內存小、快速,所以《By splitting the render target into tiles just small enough to fit in this memory, and processing those one at a time, we minimise the amount of interaction with the slower main memory。》[5] (英文比較好懂XD)
- 透過Depth值剔除掉被遮擋的Tile,減省運算。(只適用不透明渲染) [4]
[1]下面提到的Forward+不知道跟Unity目前的Forward Render差在哪?
[1]下面這些公式看不懂....該怎麼識字