最終更新: mikk_ni3_92 2008年10月09日(木) 13:35:35履歴
現在地 >> メニュー >> 基本編15 >> 基本編15::まとめコード
#include <GL/glut.h> //----------------- 各種外部変数 --------------------// double vdata[8][3]={ {0.1, 0.1, 0}, {0.6, 0.1, 0}, {0.6, 0.5, 0}, {0.1, 0.5, 0}, {0.2, 0.2, 0}, {0.5, 0.2, 0}, {0.5, 0.4, 0}, {0.2, 0.4, 0} }; //---------- プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void timer(int value); void DRAW_XYZ(); void DrawObject(); //------------- OpenGLの初期設定 -----------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL); glutCreateWindow("Stencil Buffer"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); glClearStencil(0); } //------------- メイン関数 -----------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //-------------- 各種コールバック関数 --------------------// void display() { static int r = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glLoadIdentity(); gluLookAt(1.5, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //視点の設定 glRotatef(static_cast<float>(r),0,1,0); DRAW_XYZ(); DrawObject(); glutSwapBuffers(); //ウィンドウに出力 if(++r > 360) r = 0; } void reshape(int w, int h) { glViewport(0, 0, w, h); //ビューポートの設定 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); //視野の設定 glMatrixMode(GL_MODELVIEW); } void timer(int t) { glutPostRedisplay(); glutTimerFunc(t,timer,17); //タイマー関数 } //------------- ここから各種関数 ----------------// void DRAW_XYZ() { glBegin(GL_LINES); glColor3d(0,1,0);//x glVertex2d(-100,0); glVertex2d(100, 0); glColor3d(1,0,0);//y glVertex2d(0,0); glVertex2d(0,100); glColor3d(0,0,1);//z glVertex3d(0,0,-100); glVertex3d(0,0, 100); glEnd(); } void DrawObject() { glEnable(GL_STENCIL_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDisable(GL_DEPTH_TEST); // //1st-pass glStencilFunc(GL_ALWAYS, 0, 1); //常に通過 glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); //「GL_INCR」を通過 glBegin(GL_TRIANGLE_FAN); glVertex3dv(vdata[0]); glVertex3dv(vdata[1]); glVertex3dv(vdata[2]); glVertex3dv(vdata[3]); glEnd(); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);//「GL_DECR」を通過 glBegin(GL_TRIANGLE_FAN); glVertex3dv(vdata[4]); glVertex3dv(vdata[5]); glVertex3dv(vdata[6]); glVertex3dv(vdata[7]); glEnd(); //2nd-pass glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(GL_EQUAL, 0x1, 0x1); //1と等しい glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColor3f(1,0,1); glBegin(GL_TRIANGLE_FAN); glVertex3dv(vdata[0]); glVertex3dv(vdata[1]); glVertex3dv(vdata[2]); glVertex3dv(vdata[3]); glEnd(); glColor3f(1,1,1); glDisable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); }