GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation
最近時間多了起來,準備撿起扔下了的渲染部分的知識。想拜讀下GPU Pro系列并且做個筆記,不知道自己能否堅持下來,但愿可以吧。自己能力也有限,寫的東西也只是自己的理解,肯定有很多理解不到位甚至錯誤的地方,也希望如果哪位大神看到了可以指正。關于tessellation,這篇博客介紹的很好https://blog.csdn.net/weixin_43675955/article/details/85005229
如果想讓場景更真實,你可能需要細節更高,面數更多的模型,但是這樣會使得cpu計算增加,運行變慢。
The best solution for tessellation is the recently developed tessellator stage in DirectX 11. This stage, together with the hull and the domain shader, allows the programmer to tessellate very quickly into the GPU. With this method you can send low-level detail meshes to the GPU and generate the missing geometry to the GPU depending on the camera distance, angle, or whatever you want.?
Tessellation(細分曲面)技術是將低模細節度低的模型輸入至gpu中,在DirectX11之后,在hull 和 domain shader中可以通過tessellation快速的增加細節來增強表現力,卻又不需要損耗cpu的性能。
?
?
通過DirectX 11中的渲染流水線可以看出,在Vertex Shader和 Geometry Shader之間插入了 Hull Shader Stage ,Tessellator Stage 和 Domain Shader Stage三個階段,用于處理Tessellation。
Hull Shader Stage
Hull shader 的 輸入比較特殊,叫做 contral point patch list。常規情況下,vertex shader的輸出是頂點, 但是如果要用硬件曲面細分,那么頂點著色器輸出就不再是頂點,而是control point的patch,一個patch包含多個control point,最多可以包含32個。vertex shader輸出patch給HS用。
Hull shader 的輸出包含兩部分,一部分是control points(可以在Hull shader階段進行修改),另一部分是一些常量,用于后續的tessellator stage 和 domain shader stage。為了計算這兩部分輸出,在該階段需要有兩個函數。
第一個函數叫做Constant Hull Shader,這個函數executed for every patch,也就是以patch為單位執行,在這個函數里,設置了tessellation的一些參數。
由示例代碼可以看出,該函數的輸入InputPatch是一個模板類,對應的是頂點著色器的輸出,如果這里要用曲面細分的話,就不能在VS中乘以世界和攝像機投影矩陣(這是因為在tessellation中新加入了細節,新生成了頂點,如果在vertex shader中就做完了這些操作,新生成的頂點咋辦吶),而是要留到細分結束后再變換(如果有幾何著色器的話就留到幾何著色器階段再變換)。然后這里可以用SV_PrimitiveID獲取Primitive的id。這里可以把細分等級和離攝像機的遠近、屏幕覆蓋范圍、朝向、粗糙度等掛鉤,而不是寫一個定的值,可以起到優化的效果。
該函數的輸出有兩個值,分別為SV_TessFactor和SV_InsideTessFactor,前者是邊的細分等級,后者是面片中心的細分等級。前者有幾條邊就要輸出幾個,分別對應每條邊的參數,后者則要輸出兩個,分別對應的是u和v方向。
struct PatchTess { float EdgeTess[4] : SV_TessFactor; float InsideTess[2] : SV_InsideTessFactor; // Additional info you want associated per patch. }; PatchTess ConstantHS(InputPatch<VertexOut, 4> patch, uint patchID : SV_PrimitiveID) { PatchTess pt; // Uniformly tessellate the patch 3 times. pt.EdgeTess[0] = 3; // Left edge pt.EdgeTess[1] = 3; // Top edge pt.EdgeTess[2] = 3; // Right edge pt.EdgeTess[3] = 3; // Bottom edge pt.InsideTess[0] = 3; // u-axis (columns) pt.InsideTess[1] = 3; // v-axis (rows) return pt; }第二個函數叫做Control Point Hull Shader,這個部分是每個control point都調用一次,因此和頂點著色器類似,只不過對象是control point,在這個階段我們可以改變曲面的表達形式,比如把輸入的三角面(三個control point)變成由包含十個control point的patch控制的貝塞爾曲線輸出,等等。
Control Point HS要定義不少屬性,其中domain是patch type,可選的有tri,quad或者isoline。
partitioining是細分模式,integer的細分等級會突變,而fractional_odd或者fractional_even的細分等級會漸變,頂點會逐漸移動直到消失,而不會突然pop出來或者消失。
outputtopology輸出的三角面的winding order,有triangle_cw,triangle_ccw,line這三個選項
outputcontrolpoints是輸出頂點的數量,也就是hs的執行次數,可以用SV_OutputControlPointID獲取當前Control Point的ID。
patchconstantfunc則是constantHS的名字
maxtessfactor是最大細分數量,dx11最高支持到64,這里可以手動設置得更低。
?
The Tessellation Stage
Hull shader結束之后就是細分階段,該階段由硬件完成,不可編程,通過Hull shader中設置的參數,該階段會新生成頂點,但是得出的只是頂點的uv,實際的位置等信息是在之后的domain shadr中進行計算。
在這里,可以理解下之前設置的參數,SV_TessFactor和SV_InsideTessFactor。
對于四邊形圖元,邊的順序是左上右下順時針。如下圖中的第一個圖:每個邊的參數都為4,也就是說每個邊等分成了四份。中心的參數為(4,4),也就是中心也等分成了4份。
再如下圖中的第三個圖:左邊和上邊參數為2,則二等分,右邊和下邊為4則是4等分。中心參數為2和4,分別對應u方向和v方向,所以中心部分橫向(u方向)二等分,縱向(v方向)四等分。
對于三角形圖元,細分操作同,只不過中心參數只有一個,中心的操作是在每個三角形定點到中心的延長線方向進行。
Domain Shader Stage
In the domain shader we have to reconstruct every final vertex and we have to calculate the position, normal, and texture coordinates. This is the part where the difference between terrain and ocean rendering is more important.
該階段的輸入是細分好了的曲面,在該階段我們要做的是根據uv來算出頂點的位置,法線和真正的紋理坐標。然后如果沒有幾何著色器的話,我們需要在這個階段把頂點變換到屏幕坐標里。
這里說的給定uv是針對四邊面,如果用的是三個control point的patch,那么這里給定的是質心坐標系下的uvw。
Terrain&Ocean
說實話,后邊這些沒有太看懂。。還望各位大佬指導,大體總結幾個點吧:
1.對于tessellation新生成的頂點,x和z方向的坐標可以通過patch中已有頂點的位置用插值方式得到。對于Terrain,y方向的坐標可以通過高度圖和法線圖得到已有頂點的高度參數后進行插值,對于Ocean,y坐標可以通過波浪函數計算得到。
2.很重要的一點是使用一些技術來計算tessellation factor,也就是tessellation的參數。比如對于某條邊,它必然屬于兩個patch,要確保在這兩個patch中該邊的參數一致。再比如通過mipmap參數計算tessellation參數,距離攝像機越近的,tessellation參數越大,距離攝像機越遠的地方,tessellation參數越小。
?
?
?
?
總結
以上是生活随笔為你收集整理的GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: markdown工具对比: 作业部落 v
- 下一篇: GPU Pro2 - 3.Proced