OpenGL 細分控制著色器執行次數

2021-10-11 18:57:41 字數 3442 閱讀 8857

tessellation control shader

細分控制著色器執行模式與大多數其他著色器階段不同;它與計算著色器最相似。與幾何著色器每個呼叫都可以輸出多個圖元不同,每個細分控制著色器呼叫只負責生成輸出麵片中的單個頂點。

對於渲染期間提供的每個麵片,將執行n次細分控制著色器呼叫,其中n是輸出麵片中的頂點數。因此,如果乙個繪製命令繪製了20個麵片,並且每個輸出有4個頂點,那麼總共將有80個單獨的細分控制著色器呼叫。

為同一麵片提供資料的不同呼叫是相互連線的。這些呼叫都共享它們的輸出值。它們可以讀取同一麵片的其他呼叫寫入的輸出值。但是為了做到這一點,他們必須使用同步機制(barrier)來確保細分控制著色器的所有其他呼叫至少已經執行了寫入。

因此,細分控制著色器不同呼叫可以共享資料並彼此通訊。

輸出麵片的頂點數量可以通過布局限定符(layout)來設定,也即設定了控制著色器執行的次數:

layout

(vertices = patch_size) out;

patch_size 的大小不是必須與輸入麵片頂點的大小(glpatchparameteri(gl_patch_vertices, n))匹配。

細分控制著色器的輸出變數直接傳遞到細分計算著色器,而不需要任何形式的插值(這是細分計算著色器的主要工作)。這些可以是逐頂點輸出或逐麵片輸出。

下面來測試下執行的次數:

// 建立原子計數器快取

glgenbuffers(1

,&atomic_counter_buffer)

;glbindbuffer

(gl_atomic_counter_buffer, atomic_counter_buffer)

;glbufferdata

(gl_atomic_counter_buffer,

sizeof

(gluint)

,null

, gl_dynamic_read)

;glbindbufferbase

(gl_atomic_counter_buffer,

0, atomic_counter_buffer)

;glbindbufferbase

(gl_atomic_counter_buffer,

0, atomic_counter_buffer)

;gluint* data =

(gluint *

)glmapbuffer

(gl_atomic_counter_buffer, gl_write_only)

;data[0]

=0;glunmapbuffer

(gl_atomic_counter_buffer)

;//設定輸入麵片的頂點數

glpatchparameteri

(gl_patch_vertices,3)

;//繪製六個頂點

gldrawarrays

(gl_patches,0,

6);//輸出執行次數

data =

(gluint *

)glmapbuffer

(gl_atomic_counter_buffer, gl_read_only)

;cout <<

"invocations:"

<<

*data << endl;

glunmapbuffer

(gl_atomic_counter_buffer)

;

逐頂點輸出:

//頂點著色器

#version 440 core

layout

(location =

0) in vec4 vsinpos;

layout

(location =

1) in vec4 vsincolor;

out vec4 color;

out vec4 pos;

void

main()

//細分控制著色器

#version 440 core

//輸出頂點數為3

layout

(vertices =

3) out;

layout (binding =

0, offset =

0) uniform atomic_uint tesscoord;

in vec4 color;

out vec4 tccolor;

void

main()

//細分計算著色器

逐麵片輸出:

//頂點著色器

#version 440 core

layout

(location =

0) in vec4 vsinpos;

layout

(location =

1) in vec4 vsincolor;

out vec4 color;

out vec4 pos;

void

main()

//細分控制著色器

#version 440 core

//輸出頂點數為1

layout

(vertices =

1) out;

layout (binding =

0, offset =

0) uniform atomic_uint tesscoord;

in vec4 color;

in vec4 pos;

struct outputpatch

;out patch outputpatch opatch;

void

main()

}//細分計算著色器

OpenGL著色器程式解析 著色器基礎

部分內容 於 現代opengl渲染管線嚴重依賴著色器來處理傳入的資料。如果不使用著色器,那麼用opengl可以做到的事情可能只有清除視窗內容了,可見著色器對於opengl的重要性。在opengl 3.0版本以前 含該版本 或者如果你用到了相容模式 compatibility prof?ile 環境,...

Opengl(四) 著色器

1.opengl確保至少有16個包含4個元素的頂點屬性可用。2.不同著色器之間的資料傳輸,在傳送方中宣告乙個輸出,在接收方中宣告乙個同名輸入。3.uniform是全域性的,uniform會一直保留他的資料,直到他被重置或更新。4.設定uniform的方式 glint x glgetuniformlo...

著色器與OpenGL

現代opengl渲染管線嚴重依賴著色器來處理傳入的資料。如果不使用著色器,那麼用opengl可以做到的事情可能只有清除視窗內容了,可見著色器對於opengl的重要性。在opengl 3.0版本以前 含該版本 或者如果你用到了相容模式 compatibility prof?ile 環境,opengl還...