第九章 細分著色器

2021-10-05 16:21:47 字數 2874 閱讀 5000

細分著色器只能處理麵片(patch)型別的圖元,如果啟用細分著色器,將其他型別圖元傳遞給它會產生gl_invalid_operation錯誤,如果沒有啟用細分著色器,那麼渲染麵片資料也會得到gl_invalid_operation錯誤。

麵片就是傳遞給opengl的頂點列表,處理過程要保證順序正確。

指定麵片頂點數量

void glpatchparameteri(glenum pname, glint value);
pname必須設定為gl_patch_vertices,value為麵片頂點個數,範圍需要限制在[0, gl_max_patch_vertices]中。麵片頂點個數預設為3個,如果頂點個數小於3那麼將忽略該麵片,並且不會產生幾何體。

細分控制著色器的輸入儲存在gl_in當中,它的大小與glpatchparameteri()中設定的麵片大小是相通的,可以通過gl_patchverticesin來獲取它的大小,相當於gl_in.length()。

生成的頂點列表儲存在gl_out當中,其大小可以通過布局限定符(layout)來設定:

layout (vertices = 16) out;
該宣告實現兩個目的:設定gl_out的數量,以及細分控制著色器執行的次數:每個輸出麵片頂點執行一次。

可以使用gl_invocationid來判斷當前處理的是哪個輸出頂點,也就是gl_out中的索引位置,同乙個patch中的頂點可以互相訪問資料。

gl_in的每個元素的結構為:

in gl_pervertex gl_in[gl_patchverticesin];
細分控制著色器的其他輸入變數

變數宣告

描述gl_invocationid

當前tcs請求的輸出頂點索引

gl_primitiveid

當前輸入patch的圖元索引

gl_patchverticesin

輸入patch頂點數量

gl_patchverticesout

輸出patch頂點數量

外側細分層級:gl_tesslevelouter[4]

內側細分層級:gl_tesslevelinner[2]

如果沒有繫結tcs指定細分層級:

void glpatchparameterfv(glenum pname, const glfloat* values);
pname使用gl_patch_default_outer_level或gl_patch_default_inner_level。前者需要values中包含4個浮點值,後者values需要包含2個浮點值。

每乙個通過圖元生成得到的細分座標都需要執行一次細分計算著色器,用以判斷從細分座標而來的頂點位置。

通過layout布局限定符來控制

設定圖元生成域

圖元型別

描述域座標

quads

單位塊上的乙個四邊形域

(u, v)對的形式,範圍從0~1

********s

使用重心座標的三角形

(a, b, c)座標形式,取值範圍是0~1且a+b+c=1

isolines

一系列穿過單位塊的線段集合

(u, v)對形式, u的範圍從0~1, v的範圍從0到接近於1的值

設定生成圖元的面朝向

cw表示頂點按照順時針排列

ccw表示頂點按照逆時針排列

設定細分座標的間隔選項

描述equal_space

細分層級被截斷在[1, max]內,然後取整到下乙個整數值

fractional_even_spacing

數值將被階段在[2, max]內,然後取整到下乙個偶整數值n。然後將邊界劃分為n-2個等長的部分,以及2個位與兩端的部分(可能比其他部分的長度更短)

fractional_odd_spacing

數值將被階段在[1, max]內,然後取整到下乙個奇整數值n。然後將邊界劃分為n-2個等長的部分,以及2個位與兩端的部分(可能比其他部分的長度更短)

設定輸出點集

使用point_mode選項來指定輸出點集,而不是等值線或者填充區域。

layout(********s, equal_spacing, ccw, points) out;
著色器中的細分座標是通過gl_tesscoord變數給出的。

gl_in的結構

in gl_pervertex gl_in[gl_patchverticesin];
其他輸入變數

變數宣告

描述gl_primitiveid

當前輸入麵片的圖元索引

gl_patchverticesin

輸入麵片的頂點數,也就是gl_in的大小

gl_tesslevelouter[4]

外側細分層級的值

gl_tesslevelinner[2]

內側細分層級的值

gl_tesscoord

還未進入細分計算著色器中麵片域空間的頂點座標值

輸出頂點資料結構

out gl_pervertex;
opengl中的細分可以確保麵片中生成的幾何體不會有任何的裂縫存在,但是它無法保證共享一條邊的麵片也不存在裂縫。

一種常見的解決方法是,找到所有對周長邊的頂點有貢獻的輸出麵片頂點,按照預設的方式進行排序,也就是沿著邊長向量增加大小的方式。

另一種避免裂縫的方法就是在著色器計算的時候,如果存在兩個著色器請求的頂點順序不一致的情況,就是用precise限定符。

第九章 優化器

優化器的作用是在ast中找出靜態子樹並打上標記,有以下兩個好處 每次重新渲染時,不需要為靜態子樹建立新節點 在虛擬dom中打補丁的過程可以跳過 優化器的內部實現主要分為兩個步驟 在ast中找出所有靜態節點並打上標記 在ast中找出所有靜態根節點並打上標記 通過遞迴的方式從上向下標記靜態節點時,如果乙...

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...

第九章作業

班級 0401304 學號 2013211526 姓名 鄧小俊 2.身份驗證 依據使用者所提供的身份資訊,來進行登入驗證,可以再細分為使用者是否可以登入sql sever 使用者是否可以登入到指定的目標資料庫等。授權 已通過身份驗證的使用者,檢查其所被賦予的許可權,是否可以訪問或者執行目標的物件 3...