爲鑲嵌控制着色器 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
計算新頂點的屬性。
謝謝。我不知道TCS是可選的。請檢查**更新**來回答我的問題,以進一步澄清此問題。 – Henkk
@NicolBolas快速後續問題 - 使用原始重啓功能可以指定輸入補丁大小嗎?根據https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMultiDrawElements.xhtml,'glMultiDrawElements'支持'GL_PATCHES',這使我認爲原始重啓應該也可以工作... – Ailurus
@ Ailurus:多重繪製功能與原始重啓的東西無關。原始重啓也不關心補丁類型是什麼;它會起作用。但它也將*無用*。原始重新啓動對於三角形條/風扇和線條/循環很有用。修補程序總是*個人,如三角形列表/行列表/點。因此,如果您想「重新啓動」修補程序原語......只需向列表中添加X個以上的索引,其中X是修補程序大小。 –