ポリゴンに穴があったり、辺が交差する事がないような場合、
単純な再分割を行う。
テセレータはその処理を通して、「GL_TRIANGLE」, 「GL_TRIANGLE_FAN」...などの中で、
どれが効率的かを判断し、OpenGLのレンダリングパイプラインへまわす。
もし、どんなプリミティブを使用したかを知りたい場合、
例えば、以下のようにコールバック関数の登録する。
[例]
#ifndef CALLBACK
#define CALLBACK
#endif
... ...
const char* getPrimitiveType(GLenum type)
{
switch(type)
{
case GL_POINTS:
return "GL_POINTS";
break;
case GL_LINES:
return "GL_LINES";
break;
case GL_LINE_LOOP:
return "GL_LINE_LOOP";
break;
case GL_LINE_STRIP:
return "GL_LINE_STRIP";
break;
case GL_TRIANGLES:
return "GL_TRIANGLES";
break;
case GL_TRIANGLE_STRIP:
return "GL_TRIANGLE_STRIP";
break;
case GL_TRIANGLE_FAN:
return "GL_TRIANGLE_FAN";
break;
case GL_QUADS:
return "GL_QUADS";
break;
case GL_QUAD_STRIP:
return "GL_QUAD_STRIP";
break;
case GL_POLYGON:
return "GL_POLYGON";
break;
}
return NULL;
}
//コールバック関数
void CALLBACK TessBeginCB( GLenum type )
{
glBegin(type);
std::cout << "Used Primitive :" <<getPrimitiveType(type)<< "\n";
}
... ...
tess = gluNewTess();
gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK*)(void))TessBeginCB);
... ...
サンプルコード >>
基本編13::まとめコード1