2012年3月1日木曜日

Quartz Composer / GLSL Shader / 凸多角形の内外判定

参考
外積の使い方 - Tari Lari Run


やってみた

//Fragment Shader
uniform sampler2D texture;

void main()
{
vec3 q= vec3(gl_TexCoord[0].xy+vec2(-0.5,-0.5), 0.);

int n= 6;
vec3 p[6];
//反時計回りの定義
p[0]= vec3( 0.0, 0.50, 0.);
p[1]= vec3( 0.5, 0.25, 0.);
p[2]= vec3( 0.5, -0.25, 0.);
p[3]= vec3( 0.0, -0.50, 0.);
p[4]= vec3(-0.5, -0.25, 0.);
p[5]= vec3(-0.5, 0.25, 0.);

int c= 0;
for(int i=0; i<n; i++) {
c+= cross(p[i]-q, p[(i+1)%n]-q).z>0.?0:1; //pが時計回りなら z>0?1:0
}

gl_FragColor = (c==n)?vec4(0):vec4(1);
gl_FragColor.a= 1.;
}

  • Vertex Shader側はQuartz ComposerのGLSL Shaderのデフォルトのまま
  • Shader内はGLSL Gridを置いてある


  • 結果

    (多角形の頂点を0.9倍して余白をつくってある)

    0 件のコメント: