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還...