ジオメトリシェーダ

 

  通常、我々は、基本的な二つのシェーダのために必要である頂点とフラグメントシェーダを使用して、任意のジオメトリシェーダシェーダが頂点とフラグメントシェーダとの間に配置されます。

  ジオメトリシェーダが頂点シェーダからの頂点の集合を受け取り、次に、タイルの新たな異なるタイプを出力する、変換することができる断片である、それはまた、非常に強力であり、頂点の数を増加させることができます。

  次のように一般的には、言葉で表現します:

#version 330 コア
レイアウト(点)
レイアウト(line_strip、ma​​x_vertices = 2うち

ボイドメイン(){     
    gl_Position = gl_in [ 0 ] .gl_Position + vec4( - 0.10.00.00.0 )。
    EmitVertex(); 

    gl_Position = gl_in [ 0 ] .gl_Position + vec4(0.10.00.00.0 )。
    EmitVertex(); 

    EndPrimitive(); 
}

  あなたは最初に表示、入力および出力レイアウト修飾子を定義することができます。

  入力修飾子:

レイアウト(点)

  括弧タイル型の一貫した頂点データ入力は、(括弧内の数字は、この断片中に含まれる頂点の最小数を示す後ろ)タイルのいくつかの種類があり、一般的に受信され、頂点シェーダします。

  • points:描画GL_POINTS図形要素(1)。
  • lines:描画GL_LINESまたはGL_LINE_STRIP(2)
  • lines_adjacencyGL_LINES_ADJACENCYGL_LINE_STRIP_ADJACENCY(4)
  • trianglesGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN(3)
  • triangles_adjacencyGL_TRIANGLES_ADJACENCYGL_TRIANGLE_STRIP_ADJACENCY(6)

  出力修飾子:

レイアウト(line_strip、ma​​x_vertices = 2うち

  max_vertices = 2を表していない:頂点シェーダ出力に対応する各フラグメントが、各治療の頂点シェーダ、ジオメトリの最大数は、頂点を超えて処理もはやです。

  出力修飾子の選択肢は以下のとおりです。

  • points
  • line_strip
  • triangle_strip

  

  結果は:

  1、ポイント、レンダリング、「家」のように入力フラグメント

#version 430 コア
レイアウト(点)
レイアウト(triangle_strip、ma​​x_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.200 ); 
    EmitVertex(); 
    gl_Position = P + vec4(0.2 - 0.200); 
    EmitVertex(); 
    gl_Position = P + vec4( - 0.20.200 ); 
    EmitVertex(); 
    gl_Position = P + vec4(0.20.200 ); 
    EmitVertex(); 
    gl_Position = P + vec4(0.00.400 ); 
    FCOLOR = vec3(1.01.01.0 )。
    EmitVertex(); 
    EndPrimitive(); 
} 

のボイドメイン(){ 
    build_Quadは([gl_in 0 ] .gl_Position)。
}

 

  2、nanosuitモデル爆発

#version 430 コア
レイアウト(三角)における
レイアウト(triangle_strip、ma​​x_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、ma​​x_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 )。
}

 

おすすめ

転載: www.cnblogs.com/chen9510/p/11459431.html