Real-TimeRendering讀書筆記第三章

Real-TimeRendering讀書筆記-知識點概括——第三章(記憶用)

第三章,GPU

GPU由大量的(數以千計)處理器(着色單元)構成。

SIMD模式:single instruction,multiple data 單一指令,多數據

假如有一個模型需要兩千個像素繪製,那麼一個像素着色程序就需要被調用兩千次,如果一個處理器來處理,那麼如果像素需要訪問紋理數值,這個訪問指令的生成是非常迅速的,但是因爲紋理數據並不存儲在片元數據當中,它是在內存的其他位置,那麼訪問紋理數值是很耗時間的,所以該處理器不能在等待獲得了紋理值再去繪製,而是要跳到下一個像素,生成調用紋理值指令,以此類推,直到獲得了一個紋理值之後再返回去進行繪製。

每一個着色程序調用可以理解爲一個線程(和CPU當中的線程意義不同),使用一個着色程序的線程可以被打包成一個組,在NVIDIA當中被稱爲warps,在AMD當中被稱爲wavefronts。
具體處理方式如下圖:
在這裏插入圖片描述
Shader Language(HLSL、GLSL)被編譯成虛擬機字節碼也叫做中間語言,中間語言再被驅動程序轉換爲指令集(ISA)在GPU上運行。基本數據類型是32位單精度浮點標量和向量,現代GPU也支持32位整型和64位浮點型數據。還支持一些聚合類型如結構體、矩陣和數組。

着色編程:
DrawCall:調用圖形API去繪製片元,每個可編程的圖形着色程序(shader)有兩種不同的輸入:Uniform(一次DrawCall中不會改變的值)和Varying(一次DrawCall中不斷改變的值)一般用來存儲Uniform值的寄存器要比用來存儲Varying值的寄存器多得多。
在這裏插入圖片描述
Flow control流程控制:分爲靜態流程控制和動態流程控制。

靜態流程控制主要是爲了針對不同的情況可以應用同一個shader(意義相當於ShaderLab中的Pass)
動態流程控制主要是應對不同的varying輸入進行不同的操作(相當於if語句)

圖形編程API演變史:
ShaderModel DirectX提出來區分不同硬件的着色能力。
DirectX9 ShaderModel2.0 可編程的頂點和像素着色器
ShaderModel3.0 流式控制
DirectX10 ShaderModel4.0 幾何着色器和流式輸出
DirectX11 ShaderModel5.0 tessellation stage shaders and the compute shader

VertexShader
頂點着色器的用途:動畫、程序性變形、粒子系統等等。
The Tessellation Stage (曲面細分)
相關內容參考:曲面細分着色器相關

在DirectX11中開始被支持,在OpenGL4.0中被支持
主要包含三個部分:hull shader、tessellator、domain shader

輸入是控制點和一些細分曲面。
Hull shader負責告訴tessellator生成多少三角形,以及怎樣生成,生成什麼樣子。同時hull shader也可以更改、操作控制點。
tessellator在管線當中是一個固定的函數,hull shader告訴它需要生成什麼樣子的曲面。另外hull
Shader也傳遞兩個重要的參數:inner 和 outer edge。

細分曲面的數量通過指定兩組值:內部和外部細分曲面程度來控制的。外部細分曲面的值控制域的周邊是如何劃分的,然後存放在一個隱式聲明的名爲 gl_TessLevelOuter 的含有四個元素的數組中。而內部細分曲面程度指定了域的內部如何進行劃分,然後存放在一個名爲 gl_TessLevelInner 的含有兩個元素的數組中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章