文章爲學習《Unity Shader入門精要》馮樂樂著時做的筆記
一. 初識計算機圖形學
圖形與圖形
- 圖像純指計算機內以位圖(Bitmap)形式存在的灰度信息
- 圖形含有幾何屬性,更強調場景的幾何表示,是場景幾何模型和景物的物理屬性共同組成的
- 圖形主要分成兩類:
- 基於線條信息表示
- 明暗圖(Shading)
GPU 流水線
1. 渲染管線
頂點着色器 --> 光柵化 --> 片段着色器 --> alpha測試 --> 模板測試 --> 深度測試 --> Blend --> Gbuffer --> frontBuffer --> frame buffer -->顯示器
1.1 頂點着色器
- 流水線的第一個階段,輸入來自CPU
- 處理單位爲頂點,即輸入的每個頂點都會調用一次頂點着色器
- 頂點着色器本身無法創建或者銷燬任何頂點,也無法得到頂點之間的關係,例如無法知道兩個頂點是否屬於同一個三角網格
- 所以GPU可以並行處理每一個頂點,故此階段處理速度很快
主要工作:座標轉換和逐頂點光照
1.2 光柵化
將頂點轉成像素
1.3 片段着色器
- 紋理採樣,從紋理像素 賦給頂點生成的像素
- 像素跟燈光計算
1.4 Alpha 測試
挑選合格的alpha 像素顯示
1.5 模板測試
像素可攜帶模板信息,達到模板條件的顯示出來
1.6 深度測試
符合條件的像素通過,否則丟棄
1.7 Blend
將當前要渲染的像素和已經渲染出來的像素混合運算
1.8 GBuffer
RGBA、 模板值 、深度值等
2.屏幕座標系
屏幕座標系在OpenGL和DirectX之間存在差異:
- OpenGL把屏幕左下角當成最小的窗口座標
- DirectX則把屏幕左上角當成最小的窗口座標
GPU編程語言
GLSL
OpenGL Shading Language
優點:有較好的跨平臺性,可在Windows、Linux、Mac甚至移動平臺等多種平臺上工作
原因:跨平臺性是由於OpenGL沒有提供着色器編譯器,而是由顯卡驅動來完成着色器的編譯工作,也就是說只要顯卡驅動支持GLSL的編譯,就能運行它,它依賴硬件,而非系統層級
缺點:因爲編譯結果取決於供應商,供應商編譯實現不盡相同,所以存在編譯結果不一致的情況。
HLSL
High Level Shading Language,DirectX
由微軟控制着色器的編譯,即使不同的硬件,同一着色器的編譯結果相同,故而支持HLSL的平臺相對有限,幾乎都是微軟自己的產品,其他平臺沒有可以編譯HLSL的編譯器。
CG
C for Graphic
真正意義上的跨平臺,會根據平臺的不同,編譯成相同的中間語言,因爲它和微軟合作,導致CG語言的語法和HLSL非常相似。CG語言可以無縫移植成HLSL代碼。
固定管線渲染
固定函數的流水線(Fixed-Function Pipeline),也稱固定管線,指在較舊的GPU上實現的渲染流水線,這種流水線只給開發者提供一些配置操作,開發者沒有對流水線階段的完全控制權。
固定管線通常只提供一系列接口,接口包含一個函數入口點,這些函數入口點匹配GPU上的特定邏輯功能,開發者通過這些接口來控制渲染流水線。
**標註:**已逐漸棄用,不建議繼續使用
名詞解釋
NDC:歸一化設備座標(Normalized Device Coordinates)