ジオメトリシェーダ

geometry-shader.png

概要

登場したのは OpenGL 3.2
最初の一歩に良いサンプル

出力

複数のプリミティブを出力する。

使い方

ジオメトリシェーダを使うときは、頂点シェーダで座標変換をしないで、ジオメトリシェーダに来てから座標変換すること。
だかた、頂点シェーダはこんなかんじになる

void main()
    {    
        //Transform the vertex (ModelViewProj matrix)
        gl_Position = gl_Vertex;
    }

ジオメトリシェーダに何が入力で何が出力か教える

GL_GEOMETRY_INPUT_TYPE_EXT
ジオメトリシェーダへの入力プリミティブの種類
GL_GEOMETRY_OUTPUT_TYPE_EXT
ジオメトリシェーダへの出力プリミティブの種類

入力プリミティブで指定できるもの

value プリミティブの種類 glBeginに指定される値 入力頂点数
GL_POINTS GL_POINTS 1
GL_LINES ライン(エッジ) GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP 2
GL_LINES_ADJACENCY_EXT 近傍の情報を含むライン(エッジ) GL_LINES_ADJACENCY_EXT,GL_LINE_STRIP_ADJACENCY_EXT 4
GL_TRIANGLES 三角形ポリゴン GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN 3
GL_TRIANGLES_ADJACENCY_EXT 近傍の情報を含む三角形ポリゴン GL_TRIANGLES_ADJACENCY_EXT,GL_TRIANGLE_STRIP_ADJACENCY_EXT 6

出力プリミティブで指定できるもの

  • GL_POINTS : 点.
  • GL_LINE_STRIP : ライン(エッジ).
  • GL_TRIANGLE_STRIP : 三角形ポリゴン

使い方

入力がGL_POINTSで出力がGL_TRIANGLE_STRIPなんていうのもあり。
入力は、単に1入力プリミティブあたりに何個の頂点を送るか、だけと考えて良い。
GLSLによるジオメトリシェーダ

ジオメトリシェーダで使う組み込み変数&関数

入力編

ジオメトリシェーダ側での名前 意味 頂点シェーダでの名前
int gl_VerticesIn 入ってきた頂点の数
vec4 gl_PositionIn[i] 入ってきた頂点データ1 gl_Position
vec4 gl_ClipVertexIn[i] クリップ面との距離
float gl_PointSizeIn[i] 点の大きさ gl_PointSize

varying in vec4 gl_FrontColorIn[gl_VerticesIn];
varying in vec4 gl_BackColorIn[gl_VerticesIn];
varying in vec4 gl_FrontSecondaryColorIn[gl_VerticesIn];
varying in vec4 gl_BackSecondaryColorIn[gl_VerticesIn];
varying in vec4 gl_TexCoordIn[gl_VerticesIn][];
varying in float gl_FogFragCoordIn[gl_VerticesIn];

出力編

gl_Position 出力頂点

varying out vec4 gl_FrontColor;
varying out vec4 gl_BackColor;
varying out vec4 gl_FrontSecondaryColor;
varying out vec4 gl_BackSecondaryColor;
varying out vec4 gl_TexCoord[];
varying out float gl_FogFragCoord;

組み込み関数

void EmitVertex();
void EndPrimitive();
EndPrimitiveは1ジオメトリシェーダにつき複数回しようすることが可能。


opengl3

サポートサイト Wikidot.com opengl3