FC2ブログ

OpenGLのアンビエントには20%のオフセットがかかる?

どうも、OpenGLでアンビエントを使う場合に、ライトの明るさに0.2が加算されているらしい。

たとえば、次のサンプルコードのように、ライトを全て0に設定し、徐々にアンビエントの反射だけを高くして球を並べて表示した場合、

  float zero[4] = {0001};
    
  glEnable(GL_LIGHTING);

  float al[4] = {0001};
  glEnable(GL_LIGHT0);
  glLightfv( GL_LIGHT0 , GL_AMBIENT  , al );
  glLightfv( GL_LIGHT0 , GL_DIFFUSE  , zero );
  glLightfv( GL_LIGHT0 , GL_SPECULAR , zero );

  glPushMatrix();
  for(size_t i = 0; i <= 10; ++i)
  {
    float sh[1] = {1};
    glMaterialfv( GL_FRONT_AND_BACK , GL_DIFFUSE   , zero );
    glMaterialfv( GL_FRONT_AND_BACK , GL_SPECULAR  , zero );
    glMaterialfv( GL_FRONT_AND_BACK , GL_EMISSION  , zero );
    glMaterialfv( GL_FRONT_AND_BACK , GL_SHININESS , sh   );

    float v = (float)(i) / (float)(10);
    float a[4] = {v, 001};
    glMaterialfv( GL_FRONT_AND_BACK , GL_AMBIENT , a );

    glutSolidSphere(0.52020);
    glTranslated(1,0,0);
  }
  glPopMatrix();


レンダリング結果が次のようになります。

20130504_1.png


このように、ライトが0にもかかわらず、アンビエントの色がついてしまっています。

で、この場合のライトの明るさがちょうど0.2程度となっています。


これで問題なのが、自分でシェーダを書く場合、固定シェーダと描画結果を一致させるにはこのオフセットを考慮する必要があるということです。

つまり、

gl_FragColor += gl_FrontMaterial.ambient * 0.2;

のような処理を追加してやる必要があるみたいです。


20130504_2.png
固定シェーダ

20130504_3.png
Phongシェーダ(gl_FragColor += gl_FrontMaterial.ambient * 0.2; なし)

20130504_4.png
Phongシェーダ(gl_FragColor += gl_FrontMaterial.ambient * 0.2; あり)


違いは少ないですが、やはり、0.2加算しない場合は、固定シェーダより若干暗い結果になっています。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター