Tessellation(OpenGL鑲嵌)

鑲嵌


原文地址:http://www.opengl.org/wiki/Tessellation


鑲嵌是頂點處理階段,在OpenGL渲染管線,其中頂點數據的補丁被細分成更小的基元。這個過程是由兩個着色階段和一個固定功能階段管轄。

注:此介紹的是OpenGL 4.0功能,而不是舊gluTess *鑲嵌功能。

鑲嵌過程分爲形成的可選部分三個階段頂點處理渲染管線。兩個階段的可編程;它們之間是一個固定功能階段。它們在下面描述的,在它們的處理順序。

通常,細分的過程涉及細分某種類型的補丁,然後對每個由該方法生成的頂點計算新頂點的值(位置,顏色,紋理座標等)。鑲嵌流水線的各階段執行該過程的一部分。

曲面細分控制着色器TCS)的多少決定細分活動(它也可以調整實際補丁數據,以及進料額外的補丁數據到後期階段)。因此,TCS主要負責確保整個補丁的連續性。所以,如果你有兩個補丁需要有不同層次的細分,對TCS調用了不同補丁需要使用適當的細分控制,以確保修補程序之間的接口採用鑲嵌的量相同。如果沒有這種保護,差距和休息什麼都應該是連續的補丁可能發生。

TCS是可選的,如果沒有TCS被設置缺省細分值都可以使用。

鑲嵌原始發生器接受輸入的補丁和細分它的基礎上由TCS計算或作爲默認值。

鑲嵌評估着色器TES)主罰細分的補丁,並計算頂點值,每個生成的頂點。

補丁

細分階段的補丁操作,一個原始類型記爲常數GL_PATCHES。補丁原語是一種通用原語,其中每Ñ頂點是一個新的補丁原始。每個色塊的頂點的數目可以使用應用程序級被定義爲:

void glPatchParameteri(GLenum pname​​, GLint value​​);

GL_PATCH_VERTICES作爲靶和一個值,它是具有上半開區間[1GL_MAX_PATCH_VERTICES)。補丁頂點的最大數目是實現相關的,但絕不會低於32

曲面細分控制着色器

主要文章:曲面細分控制着色器

鑲嵌的第一步是細分控制着色器(TCS)的可選調用。TCS的有兩個工作:

· 確定鑲嵌的是一種原始的應有之金額。

· 執行對輸入補丁數據的任何特殊的轉換。

TCS可以改變一個補丁的大小,添加每個補丁更多的頂點或提供更少。然而,TCS不能丟棄補丁(直接,它可以這樣做間接),也不能寫多個補丁。因此,對於由應用程序提供的每個補丁,一個修補程序將提供給下一個細分階段。

TCS是可選的。如果沒有TCS是活躍在當前程序或程序的管道,那麼這個補丁的數據是直接從通過頂點着色器調用的鑲嵌原語生成的一步。鑲嵌在這種情況下完成的量是從設置到上下文中的默認值。這些由以下函數定義:

void glPatchParameterfv(GLenum pname​​, const GLfloat *values​​);

當pnameGL_PATCH_DEFAULT_OUTER_LEVELvalues​爲浮點類型的四元數組。當pnameGL_PATCH_DEFAULT_INNER_LEVELvalues​是浮點數定義兩個內部鑲嵌水平的2個元素的數組。

這些默認值對應於TCS每個補丁輸出變量gl_TessLevelOuter [4]和gl_TessLevelInner [2] 。

原始的Tessellation生成

原語生成一個固定功能階段負責創建一組從輸入接插新的原語。只執行這個階段,如果一個細分評估着色器TES)是活躍在當前程序或程序的管道。原代受以下因素影響:

· 鑲嵌層,由TCS或默認值提供任一,如上所述。

· 該鑲嵌化頂點的間隔,通過隨後的TES階段的定義。它可以equal_spacing,fractional_even_spacing,或fractional_odd_spacing。

· 通過隨後的TES這可能是一個定義的輸入原始類型的三角形,四邊形或等值線。工商業污水附加費也可以通過提供強制鑲嵌的產生,一系列的點,而不是三角形或線point_mode原始。

· 通過隨後的TES,其可以是所定義的原語生成順序順時針或逆時針。

摘要補丁

請注意,該原語生成不會受到對TCS的用戶定義的輸出(或頂點着色器,如果沒有TCS處於激活狀態)時,TCS的輸出貼片尺寸,或除了細分級別任何每補丁TCS輸出。網格化階段的原始產生部分是完全盲目的實際頂點座標和其他補丁數據。

原語生成系統的目的是爲了確定有多少個頂點來產生,其中,爲了生成它們,以及什麼樣的基元構建了出來的。實際的每個頂點的數據,這些頂點,例如位置,顏色,等等,是要由TES生成的,基於由基元信號發生器提供的信息。

因爲這種二分法的,原始的發電機運行在什麼可能被認爲是“抽象的補丁”。它不看從TCS輸出的補丁,它認爲只有在鑲嵌一個抽象的方形,三角形,或“等值線”塊方面。

根據不同的抽象貼片型,原始生成的計算結果不同數目的細分級別,並且採用不同的細分算法。每個生成的頂點有一個規範化的位置(即座標上的範圍是[01])的抽象色塊內。這個位置有兩個或三個組成部分,這取決於補丁的類型。的座標是通過內置的提供到TES VEC3 gl_TessCoord輸入。

曲面細分級別

鑲嵌的是做了抽象的貼片式量由內層和外層鑲嵌級別定義。這些,如前所述,要麼由TCS或通過指定context參數glPatchParameter。他們是一個4向量浮點數定義“外鑲嵌水平”和彩車定義的2 -矢量“內鑲嵌的水平。”

具體的解釋取決於所使用的抽象貼片型,但總的想法是這樣的。在大多數情況下,每個鑲嵌級別定義了多少段的邊緣被細化成;這樣的4鑲嵌級別表示的邊緣將成爲4邊(2頂點成爲5)。“外部”的細分級別定義細分爲原始的外邊緣。這使得它可以爲兩​​個或兩個以上的補丁才能正常連接,同時還具有補丁中的不同細分層次。內側鑲嵌水平的抽象補丁內鑲嵌的數量。

不是所有的抽象補丁使用值在外部/內部鑲嵌級別的數據相同。例如,三角形只使用一個內部級和3級外的水平。其餘的將被忽略。

該補丁可以如所使用的抽象接插型任何外鑲嵌級別爲0或更少被丟棄。它也可以,如果它是一個浮點NaN的丟棄。被丟棄的補丁沒有得到細分的,並沒有TES調用它。很簡單,就是由系統吞噬,就好像它從來沒有人。

這使得TCS以通過傳遞0爲有關外鑲嵌級別有效地剔除補丁。

以這種方式指定的鑲嵌水平不直接使用。它們經過一個夾緊過程,以產生用於鑲嵌的原始有效細分級別。這個過程依賴於工商業污水附加費的間距參數。

在下面的討論中,最大允許的最大鑲嵌級別,由定義GL_MAX_TESS_GEN_LEVEL。它必須至少爲64,所以你有一些房間一起玩。

的間距會影響有效鑲嵌級別如下:

equal_spacing

每個細分級別分別夾在閉區間[1最大值 ]。然後,它被四捨五入到最接近的整數,得到一個有效的鑲嵌級別。

fractional_even_spacing

每個細分級別分別夾在閉區間[2最大 ]。然後,它被四捨五入到最接近的偶數整數,得到一個有效的鑲嵌級別。

fractional_odd_spacing

每個細分級別分別夾在閉區間[1最大值 - 1]。然後,它被四捨五入到最接近的奇數整數,得到一個有效的鑲嵌級別。

邊緣鑲嵌間距

在大約鑲嵌抽象的補丁即將舉行的討論不同點,將會有說鑲嵌一些原始的邊緣陳述。這意味着,根據一些鑲嵌級別細分成一系列的段。這些段的總長度是原來的線段的長度。然而,各個段的長度取決於附加費規定的間距參數。

給定一個有效的細分級,記爲Ñ,它適用於該邊緣的頂點被細化的邊緣Ñ被定義爲:

equal_spacing

邊緣被分成Ñ段。所有部門都享 ​​有平等的長度。

fractional_even_spacing,fractional_odd_spacing

如果Ñ是1,那麼沒有細分發生。否則,邊 ​​緣會被分成Ñ -相同長度的2段。也將有2個鏈段具有長度彼此相等,但不一定在第一組。這2段的長度,相對於其他人,將是Ñ - f,其中f是夾緊後,但被圍捕前的有效細分的電平值。

當Ñ == f,2段的長度將等於其他段的長度。由於Ñ - f接近2.0時,2段的相對長度接近0.0

2短段的確切位置沒有被定義,但它們應該被對稱地放置,對細分邊緣的相對側。此外,該位置必須是不變的相同的f值(從而使鑲嵌的邊緣一起工作)。

分數間隔模式的目的是爲了有更平滑,更穩定的插值細分爲水平的變化。這如果鑲嵌等級是根據相機或某物的距離,最好使用。

鑲嵌原語

三角形

三角形鑲嵌的抽象補丁是一個三角形,自然。僅在第3外的鑲嵌水平被使用,並且僅在第一內鑲嵌級別被使用。

產生並傳送到TES每個頂點將提供重心座標作爲gl_TessCoord輸入。這定義了這個頂點所在的抽象三角形內。與此配合,它可以從3個頂點乘以任何頂點屬性來計算從細分單元的適當的值。

四邊形

四抽象補丁是一個矩形,自然。所有的4和外2內的鑲嵌級別使用。

產生並傳送到TES每個頂點將被提供的歸一化的2D座標作爲gl_TessCoord輸入,較抽象補丁內的頂點的位置。

等值線


等值線的抽象補丁是一個矩形,奇怪。僅在第2外的鑲嵌水平使用;沒有內部細分級別被使用。

矩形抽象的等值線貼片代表一系列水平線,如右圖所示。第一外鑲嵌級別定義多少行是在補丁,第二個定義了多少段線分成。所以,如果你想鑲嵌一行,你應該通過gl_TessLevelOuter [0] 。但是,如果你需要更多的線鑲嵌比可以在一個單一的外部電平值來完成,工商業污水附加費完全有能力拼接多個單獨的行在一起。請記住:抽象補丁是抽象的,無論它想要的工商業污水附加費可以定位的頂點。

產生並傳送到TES每個頂點將被提供的歸一化的2D座標作爲gl_TessCoord輸入。該ý組件指定哪些行(歸一化到半開區間[01)),正在產生。在x組件定義多遠沿着這條線這個頂點應生成。

示例


等值線與苔絲水平(4,3

等值線與苔絲水平(6,2

鑲嵌評估着色器

主要文章:鑲嵌評估着色器

該曲面細分評價着色器(TES)是負責採取由原始發生器產生的抽象的座標,以及來自TCS的輸出(或頂點着色器,如果不使用TCS),並利用它們來計算頂點的實際值。這是你的代碼,你實際使用來計算新的位置/正常/ texcoords /等算法。工商業污水附加費是鑲嵌的強制部分,如果不存在,則鑲嵌不會發生。

工商業污水附加費,而不是像一個頂點着色器,在每次調用運行在細分的補丁中一個獨特的頂點(雖然,與頂點着色器,該系統可致電TES不止一次同一個頂點,所以它應該是確定的)。此外,工商業污水附加費不能剔除頂點。

示例

分類

· OpenGL着色語言

· 頂點處理

發佈了57 篇原創文章 · 獲贊 22 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章