ジオメトリシェーダ:Gettingstarted

geometry-shader-gettingstarted.png

解説

cross.PNG
真ん中に引いた縦線が。。
glBegin(GL_LINES);
    glVertex2i(gw/2, 0);
    glVertex2i(gw/2, gh);
    glEnd();

十字になるというしろもの。
ジオメトリシェーダのEmitVertex()という関数で頂点を増加させるらしい
現在のアウトプット頂点ストリームに頂点を追加する。らしい。

コード

#version 120 
#extension GL_EXT_geometry_shader4 : enable
 
    void main(void)
    {
 
        //increment variable
        int i;
 
        /////////////////////////////////////////////////////////////
        //This example has two parts
        //    step a) draw the primitive pushed down the pipeline
        //         there are gl_Vertices # of vertices
        //         put the vertex value into gl_Position
        //          EmitVertex を使って新しい頂点を作る。
        //          EndPrimitive を使ってプリミティブを作り終わったよというシグナルを送る。
        //    step b) create a new piece of geometry (これがつまり、ジオメトリシェーダーを使う醍醐味!)
        //        I just do the same loop, but swizzle the x and y values
        //    結果=> cppから送った縦線と、ジオメトリシェーダを使って描いた横線が見える
 
        //step a)cppから来た頂点情報をそのまま送る。
        for(i=0; i< gl_VerticesIn; i++){
            gl_Position = gl_PositionIn[i];
            EmitVertex();
        }
        EndPrimitive();    //プリミティブを作り終わったというシグナルを送る。                                                                                    
        //step b) 追加の新しいジオメトリ! We just swizzle the x and y terms
        for(i=0; i< gl_VerticesIn; i++){
            gl_Position = gl_PositionIn[i];
            gl_Position.xy = gl_Position.yx;
            EmitVertex();
        }
        EndPrimitive();    //プリミティブを作り終わったというシグナルを送る。        
                                                                                  /////////////////////////////////////////////////////////////
 
    }

ということは、cppから送ったシードのような頂点情報を描かない、なんてこともできるのだな。
Bibliography

サポートサイト Wikidot.com