通常、我々は、基本的な二つのシェーダのために必要である頂点とフラグメントシェーダを使用して、任意のジオメトリシェーダシェーダが頂点とフラグメントシェーダとの間に配置されます。
ジオメトリシェーダが頂点シェーダからの頂点の集合を受け取り、次に、タイルの新たな異なるタイプを出力する、変換することができる断片である、それはまた、非常に強力であり、頂点の数を増加させることができます。
次のように一般的には、言葉で表現します:
#version 330 コア レイアウト(点)で、 レイアウト(line_strip、max_vertices = 2)うち。 ボイドメイン(){ gl_Position = gl_in [ 0 ] .gl_Position + vec4( - 0.1、0.0、0.0、0.0 )。 EmitVertex(); gl_Position = gl_in [ 0 ] .gl_Position + vec4(0.1、0.0、0.0、0.0 )。 EmitVertex(); EndPrimitive(); }
あなたは最初に表示、入力および出力レイアウト修飾子を定義することができます。
入力修飾子:
レイアウト(点)で、
括弧タイル型の一貫した頂点データ入力は、(括弧内の数字は、この断片中に含まれる頂点の最小数を示す後ろ)タイルのいくつかの種類があり、一般的に受信され、頂点シェーダします。
points
:描画GL_POINTS図形要素(1)。lines
:描画GL_LINESまたはGL_LINE_STRIP(2)lines_adjacency
:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY(4)triangles
:GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(3)triangles_adjacency
:GL_TRIANGLES_ADJACENCY或GL_TRIANGLE_STRIP_ADJACENCY(6)
出力修飾子:
レイアウト(line_strip、max_vertices = 2)うち。
max_vertices = 2を表していない:頂点シェーダ出力に対応する各フラグメントが、各治療の頂点シェーダ、ジオメトリの最大数は、頂点を超えて処理もはやです。
出力修飾子の選択肢は以下のとおりです。
points
line_strip
triangle_strip
結果は:
1、ポイント、レンダリング、「家」のように入力フラグメント
#version 430 コア レイアウト(点)で、 レイアウト(triangle_strip、max_vertices = 5)うち。 でVS_OUT { vec3カラー。 } [] gs_in。 アウトFCOLOR vec3。 無効build_Quad(vec4 pを){ FCOLOR = gs_in [ 0 ] .color。 gl_Position = P + vec4( - 0.2、 - 0.2、0、0 ); EmitVertex(); gl_Position = P + vec4(0.2 - 0.2、0、0); EmitVertex(); gl_Position = P + vec4( - 0.2、0.2、0、0 ); EmitVertex(); gl_Position = P + vec4(0.2、0.2、0、0 ); EmitVertex(); gl_Position = P + vec4(0.0、0.4、0、0 ); FCOLOR = vec3(1.0、1.0、1.0 )。 EmitVertex(); EndPrimitive(); } のボイドメイン(){ build_Quadは([gl_in 0 ] .gl_Position)。 }
2、nanosuitモデル爆発
#version 430 コア レイアウト(三角)における、 レイアウト(triangle_strip、max_vertices = 3)うち。 でVS_OUT { vec3のFragPos。 VEC2 TexCoords; ノーマルvec3; } [] gs_in。 アウトTexCoords VEC2。 均一なフロート時間。 vec3 GetNormal(){ vec3 A = vec3(gl_in [ 0 ] .gl_Position) - vec3は(gl_in [ 1 ] .gl_Position)を、 vec3 B = vec3(gl_in [ 2 ] .gl_Position) - vec3は(gl_in [ 1 ] .gl_Position)を、 リターン正規化(クロス(b)参照)。 } {(正常vec3、vec4位置)爆発vec4 フロートマグニチュード= 2.0 。 vec3方向 =正常*((SIN(時間)+ 1.0)/ 2.0)* マグニチュード; 戻り位置+ vec4(方向、0.0 )。 } ボイドメイン(){ 正常vec3 = GetNormal()。 gl_Position =([gl_in爆発0 正常] .gl_Positionを、); TexCoords = gs_in [ 0 ] .TexCoords。 EmitVertex(); gl_Position =爆発(gl_in [ 1通常] .gl_Position)。 TexCoords = gs_in [ 1 ] .TexCoords。 EmitVertex(); gl_Position =([gl_in爆発2 通常] .gl_Positionを、); TexCoords = gs_in [ 2 ] .TexCoords。 EmitVertex(); EndPrimitive(); }
3、モデルの可視化、正常nanosuit
#version 430 コア レイアウト(三角)における、 レイアウト(line_strip、max_vertices = 6)うち。 でVS_OUT { vec3のFragPos。 VEC2 TexCoords; ノーマルvec3; } [] gs_in。 ボイド GenerateLine(int型のインデックス){ gl_Position = gl_in [インデックス] .gl_Position。 EmitVertex(); gl_Position = gl_in [インデックス] .gl_Position + vec4(gs_in [インデックス] .Normal、0.0)* 0.4 。 EmitVertex(); EndPrimitive(); } ボイド{main()の GenerateLine(0 )。 GenerateLine(1 )。 GenerateLine(2 )。 }