/* * クリッピング */ #include static int width; static int height; /* 初期化 */ void init(void) { /* Nothing to do */ } void resize(int w, int h) { width = w; height = h; /* ビューポートの設定 */ glViewport(0, 0, w, h); /* 射影変換モードに */ glMatrixMode(GL_PROJECTION); /* 変換行列を単位行列に */ glLoadIdentity(); /* 透視射影の視野台形 左、右、下、上、手前、奥 */ glFrustum(-1.33, 1.33, -1.0, 1.0, 1.0, 5.0); /* モデル変換モードに戻す */ glMatrixMode(GL_MODELVIEW); } /* 画面表示 */ void display(void) { int i, t; GLdouble clip0[4] = {0.0, 1.0, 0.0, 0.0}; GLdouble clip1[4] = {0.0, -1.0, 0.0, 0.0}; glDisable(GL_SCISSOR_TEST); /* 黒でクリア */ glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glClipPlane(GL_CLIP_PLANE0, clip0); glClipPlane(GL_CLIP_PLANE1, clip1); glEnable(GL_SCISSOR_TEST); glScissor(4, 4, width-8, height-8); /* 白でクリア */ glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glTranslated(0.0, 0.0, -3.0); glEnable(GL_CLIP_PLANE0); glBegin(GL_TRIANGLES); glColor3d(1.0, 0.0, 0.0); glVertex3d(0.0, 1.0, 0.0); glVertex3d(-1.0, -1.0, 0.0); glVertex3d(1.0, -1.0, 0.0); glEnd(); glDisable(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE1); glBegin(GL_TRIANGLES); glColor3d(0.0, 0.0, 1.0); glVertex3d(0.0, 1.0, 0.0); glVertex3d(-1.0, -1.0, 0.0); glVertex3d(1.0, -1.0, 0.0); glEnd(); glDisable(GL_CLIP_PLANE1); glFlush(); } int main(int argc, char *argv[]) { /* GLUT の初期設定 */ glutInit(&argc, argv); glutInitWindowPosition(100, 50); glutInitWindowSize(400, 300); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); /* 各関数の指定 */ glutDisplayFunc(display); glutReshapeFunc(resize); /* 初期設定 */ init(); /* メインループ */ glutMainLoop(); return 0; }