在Vertex shader與Fragment shader之後,又出現了新的Geometry Shader,由於在OpenGL 2.1里面,Geometry shader仍然還是在extension,所以使用的文件跟範例還是比較少了一點.
首先Geometry shader是位在OpenGL rendering pipeline裡面,Vertex shader與Fragment shader的中間. Vertex Shader的單位是Vertex,也就是在Vertex Shader裡面看到的是單一Vertex. Geometry Shader的單位則是Primitive,在Geometry裡面可以看到Vertex Shader送過來的單一Primitve,然後處理成一個以上的Primitive送出去.而Fragment Shader則是看到Primitive 作Rasteration之後的單一Fragment(Pixel). 這些是使用時必須先要有的概念.
接下來 Geometry shader的使用流程與Vertex shader與Fragment shader類似.或許應該說是大部分都一樣,但是有一點點的不同,就是多了一些Geometry shader的專屬Function控制.
例如:原本使用Vertex Shader與Fragment Shader的流程:
ps. (在這裡以OpenGL 2.1的介面為主,而不是OpenGL 1.5的ARB function介面,不過兩者幾乎差不多,OpenGL 2.1的Shader相關Function大多是少了ARB的Postfix,但是還是有些Function是整個更換名字)
首先Create Shader Object:
glCreateShader
glShaderSource
glCompileShader
接下來Create Shader Program Object:
glCreateProgram
glAttachShader
glLinkProgram
glUseProgram
Geometry Shader與另兩種Shader,在Create Shader Object的流程上是相同的.在glCreateShader時傳入GL_GEOMETRY_SHADER_EXT代表Geometry shader object.要注意的是使用Geometry Shader時也必須要使用Vertex Shader.
而在Create Shader Program Object的流程上除了照常Attach Shader與Link Shader,還必須要在glLinkProgram之前,透過執行三個Function對Geometry shader作設定.
glProgramParameteriEXT(programID, GL_GEOMETRY_INPUT_TYPE_EXT, input_Primitive_Type);
glProgramParameteriEXT(programID, GL_GEOMETRY_OUTPUT_TYPE_EXT, output_Primitive_Type);
glProgramParameteriEXT(programID, GL_GEOMETRY_VERTICES_OUT_EXT, number_of_vertices);
這三個Function,第一個代表經由Vertex shader送到Geometry Shader的Primitive 種類.
第二個代表由Geometry Shader送出去作Rasteration的Primitive種類.
第三個則是送出去的個別Primitive裡,最大的Vertices數目.
其中input_Primitive_Type被限定只允許下列Primitive:
* GL_POINTS
* GL_LINES
* GL_LINES_STRIP
* GL_LINES_LOOP
* GL_TRIANGLES
* GL_TRIANGLE_STRIP
* GL_TRIANGLE_FAN
* GL_LINES_ADJACENCY_EXT
* GL_LINE_STRIP_ADJACENCY_EXT
* GL_TRIANGLES_ADJACENCY_EXT
* GL_TRIANGLE_STRIP_ADJACENCY_EXT
其中前面七項GL_POINTS,GL_LINES,GL_TRIANGLES相關這些,我想不用講大家都曉得.
這邊只解釋新增的這四種Primitive
* GL_LINES_ADJACENCY_EXT
代表一個有四個頂點的Primitive,其中第二個點與第三個點會形成線段,而第一個點與第四個點則用來提供2,3鄰近點的資訊.
* GL_LINE_STRIP_ADJACENCY_EXT
與GL_LINES_ADJACENCY_EXT類似,第一個點跟最後一個點提供資訊,剩下的點則跟Line Strip一樣形成線段.
* GL_TRIANGLES_ADJACENCY_EXT
代表一個有六個頂點的Primitive,其中第1,3,5個點代表一個Triangle,而地2,4,6個點提供鄰近資訊.(由1起算)
* GL_TRIANGLE_STRIP_ADJECENCY_EXT
4 2N個Vertices代表N個Primitive,其中1,3,5,7,9…代表原本的Triangle strip形成Triangle,而2,4,6,8,10…代表鄰近提供資訊的點.(由1起算)
output_Primitive_Type被限定只允許三類Primitive:
* GL_POINTS
* GL_LINES_STRIP
* GL_TRIANGLE_STRIP
如此,就可以在OpenGL裡面使用包含了Geometry Shader程式了.
晚點再來介紹Geometry Shader的 GLSL語法.
[b]加入粗體文字[/b]:D很好,谢谢