bambooflow Note

はじめてのジオメトリシェーダ

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

はじめてのジオメトリシェーダ


ここでは、ジオメトリシェーダで3角形データを素通りするプログラムを記述します。
サンプルのジオメトリシェーダは何もしません。
まずは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


glsl_geometry00.tgz

コード


  • バーテックスシェーダ

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()を呼びます。


  • フラグメントシェーダ

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;
}
 


  • ソースコード

 

タグ:

OpenGL GLSL geometry
記事メニュー
ウィキ募集バナー