スポンサーリンク

| キーワード:

OpenGLで裏面と表面で別の色を指定する

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();

  }

glColor3*で描画

  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();

  }

glMaterialfvで描画

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);

  }

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: