2017-02-27 41 views
2

鑲嵌控制着色器 Khronos的wiki指出爲什麼我們必須分別指定鑲嵌着色器的輸入和輸出補丁大小?

輸出貼片尺寸不必匹配輸入貼片尺寸。

這是爲什麼?爲什麼當控制着色器能夠在原生代獲得補丁之前改變輸入補丁大小時,我們必須指定輸入補丁大小?

更新

以下說明是否正確?

輸入補丁(至TCS)大小由glPatchParameter(GL_PATCH_VERTICES, X)設置。這具有這樣的結果,即in屬性陣列的長度爲X.

TCS: 
in vec4 vs_tc_position[]; // This has a length of X 

輸出接插大小由layout (vertices = Y) out;的TCS定義。這意味着屬性陣列的長度Y.

TCS: 
out vec4 tc_te_position[]; // This has a length of Y 

的TCS是稱爲y倍的和直接傳遞輸出到TES。所以,TES的in屬性陣列具有Y.

TES: 
in vec4 tc_te_position[]; // This has a length of Y 

的長度輸出補丁的頂點的數量無關的鑲嵌原語生成(TPG),因爲它只能看到一個抽象補丁。抽象補丁的頂點數量由TES layout (TYPE) in;定義。

的TES被稱爲對於每個新頂點,其導致從抽象補丁由於由TCS(當其存在時)所定義的鑲嵌水平或通過glPatchParameter(GL_PATCH_DEFAULT_{OUTER|INNER}_LEVEL)。然後,TES可以基於來自抽象補丁的gl_TessCoord和來自TCS的所有頂點(更像控制點)來插入屬性。

示例

因此,下面的情況是可能的。

glPatchParameteri(GL_PATCH_VERTICES, 1); 

TCS獲得每個補丁的一個頂點。

layout (vertices = 5) out; 

TCS爲輸出補丁創建5個頂點。不知何故。

layout (quads) in; 

TPG使用quad作爲抽象補丁和細分。然後在每個新頂點上調用TES並從TCS中插入5個輸出頂點的屬性,抽象補丁(以某種方式)用gl_TessCoord計算新頂點的屬性。

回答

3

必須指定輸入補丁大小,因爲根本沒有有TCS。

另外,請記住輸入補丁大小用於解釋您渲染的頂點流。每個X頂點都是一個補丁,因此OpenGL需要知道要使用哪個X.即使使用TCS,OpenGL也需要有一個輸入大小來知道有多少個頂點要傳遞給TCS操作。

至於爲什麼輸入和輸出補丁大小可以不同,那就是爲了給TCS和用戶自由做任何他們想做的事情。 TCS可以根據需要添加,刪除或修改數據,包括添加或刪除整個值。

因此,TCS可以將單個輸入頂點轉化爲4個輸出頂點;這可能對像四邊形鑲嵌的東西有用。

+0

謝謝。我不知道TCS是可選的。請檢查**更新**來回答我的問題,以進一步澄清此問題。 – Henkk

+0

@NicolBolas快速後續問題 - 使用原始重啓功能可以指定輸入補丁大小嗎?根據https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawElements.xhtml,'glMultiDrawElements'支持'GL_PATCHES',這使我認爲原始重啓應該也可以工作... – Ailurus

+1

@ Ailurus:多重繪製功能與原始重啓的東西無關。原始重啓也不關心補丁類型是什麼;它會起作用。但它也將*無用*。原始重新啓動對於三角形條/風扇和線條/循環很有用。修補程序總是*個人,如三角形列表/行列表/點。因此,如果您想「重新啓動」修補程序原語......只需向列表中添加X個以上的索引,其中X是修補程序大小。 –

相關問題