glMaterialfvで着色する場合、第一引数にGL_FRONTかGL_BACKを指定して切り替える
glColor3fで着色する場合、カリングを使い裏面のみ描画、表面のみ描画を切り替えて二回レンダリングする。
//ポリゴンを描画 void render() { float v = 0.7; glBegin(GL_QUADS); glVertex3f(-v, -v, 0.0); glVertex3f(v, -v, 0.0); glVertex3f(v, v, 0.0); glVertex3f(-v, v, 0.0); glEnd(); }
void draw_by_color() { glEnable(GL_CULL_FACE);//カリングを有効化 glCullFace(GL_FRONT); glColor4f(1, 0, 0, 1); render(); glCullFace(GL_BACK); glColor4f(0, 1, 0, 1); render(); }
void draw_by_material() { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat white[4]{ 1,1,1,1 }; GLfloat red[4]{ 1,0,0,1 }; GLfloat green[4]{ 0,1,0,1 }; GLfloat pos[4]{ 0,0,0,1 }; glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);//両面に光を当てる glLightfv(GL_LIGHT0, GL_POSITION, pos);//ライト位置設定 glLightfv(GL_LIGHT0, GL_AMBIENT, white);//環境光色設定 glMaterialfv(GL_FRONT, GL_AMBIENT, red);//表面の材質 glMaterialfv(GL_BACK, GL_AMBIENT, green);//裏面の材質 render();//オブジェクトのレンダリング glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); }
void draw() { ///////////////////// // 描画 glViewport(0, 0, width, height); glClearColor(0.3, 0.3, 0.3, 1); glClear(GL_COLOR_BUFFER_BIT); Sleep(1); angle++; glPushMatrix(); glRotated(angle, 1, 0, 0); //draw_by_color();//この二つの関数切り替え draw_by_material(); glPopMatrix(); // ///////////////////// glFlush(); glfwSwapBuffers(_window); }