10.光源の効果の利用



光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。

09.で作成したモデルビューワに光源の効果を付加します。

解説

光源の効果を利用した描画をするためにすべきことは以下です。

  1. 光源の設定をする。
  2. 光源を有効にする。
  3. ポリゴンを、頂点の座標値に加えて、頂点の法線ベクトルも設定して描画する。

プロジェクトを開く

09.で作成したモデルビューワプロジェクトを開きます。

ライトOpenGLViewクラスを新規作成する

「メニュー/プロジェクト/クラスの追加」を選択します。

カテゴリ:MFC
テンプレート:MFC クラス
クラス名:COpenGLLightView
基本クラス:CView

「完了」ボタンを押します。

ビルドし、エラー、警告がないことを確認します。

ライトOpenGLViewクラスの親クラスの変更

OpenGLLightView.h に
#include "OpenGLTrackView.h"
を追加します。



OpenGLLightView.cpp および OpenGLLightView.h の
「CView」 を 「COpenGLTrackView」 に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)

ビルドし、エラー、警告がないことを確認します。

ライトOpenGLViewクラスのOnDraw関数の削除

ベースOpenGLビュークラスのOnDraw関数が呼ばれるように、ライトOpenGLビュークラスのOnDraw関数を削除します。
(オーバーライド関数の削除は、「クラスビュー」と「プロパティビュー」を使用します。
 まず、「クラスビュー」で、メッセージハンドラを削除するクラスを選択します。
 次に、「プロパティビュー」のツールバーの「オーバーライド」を選択します。削除するオーバーライド関数の右側のドロップダウンリストを用いてオーバーライド関数を削除します)

ビルドし、エラー、警告がないことを確認します。

ピックOpenGLビュークラスの親クラスの変更

OpenGLPickView.h の
#include "OpenGLTrackView.h"

#include "OpenGLLightView.h"
に書き換えます。



OpenGLPickView.cpp および OpenGLPickView.h の
「COpenGLTrackView」 を 「COpenGLLightView」 に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)

ビルドし、エラー、警告がないことを確認します。

光源設定クラスの作成

OpenGLLightView.h に
以下のような光源設定クラスを追加します。



ビルドし、エラー、警告がないことを確認します。

メンバ変数、メンバ関数の宣言の追加

OpenGLLightView.h のライトOpenGLビュークラス定義の最初にメンバ変数、メンバ関数の宣言を追加します。

メンバ変数の初期化

OpenGLLightView.cpp のライトOpenGLビュークラスのコンストラクタにメンバ変数の初期化を追加します。

メンバ関数の定義の追加

OpenGLLightView.cpp にメンバ関数の定義を追加します。
光源が、「モデル座標系の移動の影響は受けるが、モデル回転変換の影響は受けない」ように、SetupLight関数の呼び出しをモデル座標系の移動と、モデル回転変換の間に配置します。



OpenGLTrackView.h のトラックOpenGLビュークラスのメンバ変数
m_f3RenderingCenter
m_f16ViewingTransformMatrix
をprotected変数とします。



ビルドし、エラー、警告がないことを確認します。

モデルデータ構造クラスに、頂点法線ベクトルメンバー変数の追加

ポリゴンが光源の効果を受けるには、頂点座標値に加えて、頂点法線ベクトルが必要です。

頂点法線ベクトルのバッファオブジェクトのIDを取得する関数を追加します。(GetTriangleVertexNormalVboID関数)
VBO構築処理関数に、頂点法線ベクトルのバッファオブジェクトの作成、データの転送処理を追加します。

Model.h の CModel クラス宣言の内容を以下のようにします。



Model.cpp の CModel::MakeVBO 関数の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

RenderModelの編集

面に対して光源の効果が有効になるように
CModelViewerView::RenderModel関数
の実装を変更します。

面の描画処理の、描画モードによる色設定の場合分けの通常描画の色設定の処理に、
面に対して光源の効果を有効にする処理
glEnable( GL_LIGHTING );
面の色設定をマテリアル設定とする処理
glEnable( GL_COLOR_MATERIAL )
頂点法線ベクトルのバッファオブジェクトを使用するための処理
glEnableClientState( GL_NORMAL_ARRAY );
glBindBuffer( GL_ARRAY_BUFFER, m_model.GetTriangleVertexNormalVboID() );
glNormalPointer( GL_FLOAT, 0, 0 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
を追加します。

面の描画処理が終わったら、変更した設定を元に戻します。
面の描画処理の、glDrawArrays関数呼び出し直前に、
glDisableClientState( GL_NORMAL_ARRAY );
glDisable( GL_COLOR_MATERIAL );
glDisable( GL_LIGHTING );
を追加します。

ModelViewerView.cpp のRenderModel関数 の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

実行

モデルの面の明るさに差があり、立体感があります。
面の色としてglColorで与えた色が反映されています。

model01.stlファイルの読み込み

ダウンロード

ソースファイルダウンロード (ModelViewerOpenGLMFC2015_10_lighting.zip)

関連ページ

前項目:09.描画の高速化(頂点バッファオブジェクトの利用)

次項目:11.マテリアルの効果の利用