OpenGL 渲染架構(gòu)
3個數(shù)據(jù)傳遞通道
Attribute
用于傳遞數(shù)據(jù)到
Vertex Shader
,無法直接傳遞到Fragment Shader
。可以將數(shù)據(jù)先傳入
Vertex Shader
(圖中的&some Ins
)庵朝,不作處理/作處理 的數(shù)據(jù)被間接傳遞到Fragment Shader
(這部分數(shù)據(jù)被包含在圖中的Ins
)。-
傳遞對每個頂點都要做改變的數(shù)據(jù)元素 (經(jīng)常發(fā)生改變的參數(shù))又厉,如:
- 頂點數(shù)據(jù)偿短,
x, y, z, w
- 顏色數(shù)據(jù)
- 紋理坐標 (圖片映射坐標),實際是通過
Vertex Shader
傳遞給Fragment Shader
- 光照法線
- (需要經(jīng)常變的) 投影矩陣馋没,模型矩陣
- 頂點數(shù)據(jù)偿短,
Uniforms
能傳遞到
Vertex Shader
和Fragment Shader
。-
用于傳遞比較固定的參數(shù)降传,處理批次任務的參數(shù)篷朵,如:
- 做圖形旋轉(zhuǎn)時用到的旋轉(zhuǎn)矩陣
- 視頻顏色空間
YUV
轉(zhuǎn)顯示器顏色空間RGB
的變換矩陣 - 時間戳
Texture Data
能傳遞到
Vertex Shader
和Fragment Shader
。-
傳遞:
- 圖片
- 地形信息等大型數(shù)據(jù)
其他
經(jīng)過
Vertex Shader
處理后婆排,就已經(jīng)得到各個頂點的NDC Space
(規(guī)范化設備坐標)声旺,這部分數(shù)據(jù)將會連同 其他的參數(shù)/數(shù)據(jù) 傳入下一步,進行Primitive Assembly
(圖元裝配)段只。很明顯腮猖,用戶只能設置
Primitive Assembly
(圖元裝配) 的參數(shù),而無法對其過程進行操作赞枕。
GPU-CPU 數(shù)據(jù)傳輸
簡單過程
詳細過程
MMIO (Memory-mapping I/O)
以前的做法:訪問 I/O設備 需要做額外的程序/接口處理澈缺。
MMIO 的做法:將 I/O設備 映射到內(nèi)存空間坪创,如此一來,訪問 PCI-E顯卡上的幀緩存等姐赡,就像讀取內(nèi)存一樣簡單莱预。
CPU-GPU 基于 MMIO 進行交流。
Unified Virtual Address Space
- 內(nèi)存和顯存使用統(tǒng)一的虛擬地址项滑,這更加提升了 MMIO 的便捷依沮。
DMA (Direct Memory Access)
使硬件之間可以傳輸數(shù)據(jù),而不需要依賴 CPU枪狂,避免無意義的 CPU 資源占用危喉。
由 MMIO 進行命令控制
Context
代表 GPU 計算的狀態(tài)
在 GPU 擁有自己的虛擬地址
一個 GPU 可同時存在多個 context
Channel
是 GPU 的一個硬件單元
接收來自 context 的命令流 (Command Stream),傳入運算核心州疾。
一個 context 可擁有多個 Channel辜限,一個 Channel 只對應一個 context。
CPU 能通過 MMIO 訪問顯存中的一個特殊區(qū)域孝治,這個區(qū)域?qū)iT存放 Channel
命令列粪。所以說 Channel 的任何命令都是由 CPU 發(fā)出。
參考
計算機那些事(8)——圖形圖像渲染原理 http://chuquan.me/2018/08/26/graphics-rending-principle-gpu/
NVIDIA GPU 硬件介紹 https://www.dazhuanlan.com/2019/08/15/5d55114f9187c/