はじめてのジオメトリシェーダ
ここでは、ジオメトリシェーダで3角形データを素通りするプログラムを記述します。
サンプルのジオメトリシェーダは何もしません。
まずはOpenGL3 core profileでジオメトリシェーダが実行できる環境を手に入れることを目的とします。
サンプルのジオメトリシェーダは何もしません。
まずはOpenGL3 core profileでジオメトリシェーダが実行できる環境を手に入れることを目的とします。
- OpenGL 3.x core profile
- GLSL 3.3 (>=3.0)
- GLEW 1.5.7
- GLUT (flee-glut 3.7)
- GLM 0.9.0.6

Download

コード
- バーテックスシェーダ
simple.vert
#version 330
uniform mat4 modelMatrix; // モデル・マトリックス
uniform mat4 viewMatrix; // ビュー・マトリックス
uniform mat4 projectionMatrix; // 射影・マトリックス
in vec3 a_position;
in vec3 a_normal;
out vec3 g_Normal;
void main(void)
{
g_Normal = (viewMatrix*modelMatrix*vec4(a_normal, 0.0)).xyz;
gl_Position = projectionMatrix*viewMatrix*modelMatrix*vec4(a_position.xyz, 1.0);
}
- ジオメトリシェーダ
simple.geom
#version 330
layout(triangles) in;
layout(triangle_strip, max_vertices=6) out;
in vec3 g_Normal[3];
out vec3 v_Normal;
void main(void)
{
for (int i=0; i<gl_in.length(); i++)
{
v_Normal = g_Normal[i];
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
このサンプルの主部分になります。
次の設定で三角形の入力から三角形ストリップの出力を行います。
次の設定で三角形の入力から三角形ストリップの出力を行います。
layout(triangles) in; layout(triangle_strip, max_vertices=6) out;
main関数内は、trianglesの単位で処理します。
頂点設定ごとにEmitVertex()を呼び、最後の頂点設定後にEndPrimitive()を呼びます。
頂点設定ごとにEmitVertex()を呼び、最後の頂点設定後にEndPrimitive()を呼びます。
- フラグメントシェーダ
simple.frag
#version 330
in vec3 v_Normal;
out vec4 fragColor;
void main(void)
{
vec4 color = vec4(0.0, 0.3, 0.7, 1.0); // R,G,B,A
float intensity;
intensity = max(dot(v_Normal, vec3(0.0,0.0,1.0)),0.0);
fragColor = color*intensity;
}
- ソースコード