ジオメトリシェーダーを使用する

Geometry Shader はマテリアルタイプのオプションのシェーダーです。ジオメトリシェーダーは、Vertex Shader またはオプションのテッセレーションシェーダーから、線や三角形などのプリミティブを形成する頂点のセットを入力として受け取ります。ジオメトリシェーダーはこれらの頂点を変換し、Fragment Shader に渡します。

ジオメトリシェーダーとテッセレーションシェーダーを使用するには、Kanzi アプリケーションを実行するハードウェアが OpenGL ES 3.2 または Vulkan 1.1 をサポートしている必要があります。ジオメトリシェーダーとテッセレーションシェーダーは、タイルベースのレンダリングアーキテクチャではパフォーマンスを低下させる可能性があることに注意してください。そのため、モバイルや組み込みハードウェアではジオメトリシェーダーとテッセレーションシェーダーの使用を避けることをお勧めします。

テッセレーションシェーダーの使用 を参照してください。

この手順では、ジオメトリシェーダーを使用して、プリミティブメッシュの各頂点に三角形を描画します。

ジオメトリシェーダーを使用するには:

  1. Kanzi Studio のメインメニューで、Project > Properties を選択し、Target Graphics API を OpenGL ES 3.2 に設定します。

    ../../_images/properties-target-graphics-api-es32.png
  2. マテリアルタイプにジオメトリシェーダーを追加します。

    例えば、Library > Materials and Textures > Material Types で、Alt を押しながら右クリック の VertexPhong マテリアルタイプを選択し、Geometry Shader を選択します。

    Kanzi Studio は、マテリアルタイプに Geometry Shader を Vertex Shader と Fragment Shader の間に作成します。

    Geometry Shader のソースファイルの拡張子は .geom.glsl です。

    ../../_images/library-create-geometry-shader.png ../../_images/library-geometry-shader.png
  3. Library で、Geometry Shader をダブルクリックして Shader Source Editor で開き、ニーズに合わせてシェーダーコードを編集します。

    例えば、メッシュの各頂点に三角形を描画するには、ジオメトリシェーダーファイルの内容を次のように置き換えます。

    #version 320 es
    // Turn triangles into three triangles by vertices.
    layout(triangles) in;
    layout(triangle_strip, max_vertices = 9) out;
    precision highp float;
    
    in lowp vec3 vAmbDif[];
    out lowp vec3 fragColor;
    
    void main() {
        for(int i = 0; i < 3; ++i)
        {
            fragColor = vAmbDif[i];
            gl_Position = gl_in[i].gl_Position + vec4(0, -0.5, 0, 0);
            EmitVertex();
            gl_Position = gl_in[i].gl_Position + vec4(0.5, 0.5, 0, 0);
            EmitVertex();
            gl_Position = gl_in[i].gl_Position + vec4(-0.5, 0.5, 0, 0);
            EmitVertex();
            EndPrimitive();
        }
    }
    

    Save をクリックします。

  4. ジオメトリシェーダーを追加したマテリアルタイプで、Fragment Shader をダブルクリックして Shader Source Editor で開きます。シェーダーコードを編集して、ジオメトリシェーダーの出力を使用します。

    例えば、フラグメントシェーダーファイルの内容を次のように置き換えます。

    #version 320 es
    
    precision lowp float;
    
    in vec3 fragColor;
    out vec4 outColor;
    
    void main()
    {
        outColor = vec4(fragColor, 1);
    }
    

    Save をクリックします。

  5. 3Dノードを作成してメッシュをレンダリングします。そのノードを、ジオメトリシェーダーを追加したマテリアルタイプを使用するマテリアルを使用するように設定します。

    例えば、Node Tree で、Plane ノードを作成します。Properties で、Mesh Material プロパティを VertexPhongMaterial に設定します。

    ../../_images/node-tree-plane1.png ../../_images/properties-plane-mesh-material1.png ../../_images/preview-geometry-shader-initial.png
  6. Properties で、コンテンツの外観を調整します。

    たとえば、次を追加して設定します:

    • Material > Ambient Color を使用して三角形の色を設定します。

    • Subdivisions プロパティを使用して、三角形の数を増やします。

      Subdivisions プロパティは、プリミティブメッシュのテッセレーションレベルを設定します。Plane ノードはデフォルトで4つの頂点を持つ1つのタイルで構成されています。例えば、Subdivisions プロパティを3に設定すると、平面の頂点数は25に増加します。プリミティブメッシュのテッセレーションレベルを設定する を参照してください。

    ../../_images/properties-plane-subdivisions.png ../../_images/preview-geometry-shader-properties.png
../../_images/geometry-shader-rotation.gif

関連項目

シェーダー

テッセレーションシェーダーの使用

シェーダーのベストプラクティス