ofxIBL
https://github.com/yasuhirohoshino/ofxIBL
openFrameworksでIBL(Image Based Lighting)を行うアドオンです。
環境の画像を光源として扱うため、デフォルトのofLightなどを使ったライティングよりも、自然でリアルなライティングを行うことができます。
アドオンは以下の3つのクラスにより構成されます。
・ofxFilteredCubeMap : 1枚のパノラマ画像からキューブマップを作成し、管理するクラス
・ofxIBLMaterial : レンダリングするオブジェクトの色やテクスチャー、ラフネス、メタリックなど、質感を管理するクラス
・ofxIBL : キューブマップとマテリアルの情報からIBLを実行するクラス
–
ofxFilteredCubeMap
Equarectangularの画像を読み込み、キューブマップを作成します。
キューブマップ作成時に、複数のブラーがかかったテクスチャーを作成し、一つのキューブマップのMipMapに登録します。
毎回テクスチャーを作成するのは時間がかかるため、キャッシュを取ることもできます。
また、.hdrや.exr形式の画像を読み込むことも可能であり、HDR画像を読み込んだ場合、その後のレンダリング時に自動的にHDRレンダリングが実行されます。
1 2 3 4 5 |
ofxFilteredCubeMap::load(string imagePath, int baseSize, bool useCache, string cacheDirectry); // imagePath : キューブマップに使用する環境画像のパス // baseSize : キューブマップの一面のベースとなるサイズ(このサイズを元に、サイズを1/2倍しながらMipMapが生成されます。) // useCache : キャッシュをとるかどうか // cacheDirectry : キャッシュの保存先ディレクトリ(何も指定しない場合dataフォルダに保存されます。) |
–
ofxIBLMaterial
以下の8つのパラメーターを用い、レンダリングするオブジェクトの質感を設定します。
・BaseColor : オブジェクトの基本色(Albedoとも呼ばれます)
・Roughness : オブジェクトの表面の荒さ
・Metallic : オブジェクトの表面の反射率
・Normal Map : 法線マップ
・Occlusion Map : オブジェクトの際の部分や凹みの部分など、光が届かず陰になっている部分を描画したテクスチャー
・Emission Map : 発光するためにライティングの影響を受けない部分を描画したテクスチャー
・Detail BaseColor Map : 細かい質感表現のために、ベースカラーに加えて適用するテクスチャー
・Detail Normal Map : 細かい質感表現のために、元の法線マップに加えて適用する法線マップ
BaseColor
1 2 3 4 |
ofColor baseColor; // ベースカラーを設定します。 bool useBaseColorMap; // ベースカラーのテクスチャーを有効・無効にします。 ofImage * baseColorMap; // ベースカラーのテクスチャーを設定します。 bool useGrobalColor; // ofSetColorで設定された色をベースカラーとして使用します。 |
Roughness
1 2 3 |
float roughness; // オブジェクトの表面の荒さを設定します(0.0 - 1.0, 値が大きいほどキューブマップの反射がぼやけます) bool useRoughnessMap; // ラフネスマップを有効・無効にします。 ofImage * roughnessMap; // ラフネスマップを使用し、一つのオブジェクトのレンダリング時に、部分ごとに複数のラフネスを設定することができます。 |
Metallic
1 2 3 |
float metallic; // オブジェクトの表面の反射率を設定します(0.0 - 1.0, 値が大きいほどキューブマップのテクスチャーを反射します) bool useMetallicMap; // メタリックマップを有効・無効にします。 ofImage metallicMap; // メタリックマップを使用し、一つのオブジェクトのレンダリング時に、部分ごとに複数のメタリックを設定することができます。 |
Normal Map
1 2 3 |
bool useNormalMap; // 法線マップを有効・無効にします。 ofImage * normalMap; // 法線マップを設定します。 float normalVal; // 法線マップの適用率を設定します。(0.0 - 1.0, 値が大きいほど法線マップが適用されます) |
Occlusion Map
1 2 |
bool useOcclusionMap; // オクルージョンマップを有効・無効にします。 ofImage * occlusionMap; // オクルージョンマップを設定します。 |
Emission Map
1 2 |
bool useEmissionMap; // エミッションマップを有効・無効にします。 ofImage * emissionMap; // エミッションマップを設定します。 |
Texture Repeat
1 |
ofVec2f textureRepeatTimes; // 以上のテクスチャーの繰り返し回数を設定します。 |
Detail Maps
1 2 3 4 5 6 7 |
bool useDetailBaseColor; // ディティール・ベースカラーを有効・無効にします。 ofImage * detailBaseColorMap; // ディティール・ベースカラーを設定します。 bool useDetailNormalMap; // ディティール・ノーマルマップを有効・無効にします。 ofImage * detailNormalMap; // ディティール・ノーマルマップを設定します。 ofVec2f detailTextureRepeatTimes; // 以上のテクスチャーの繰り返し回数を設定します。 |
–
ofxIBL
以下のようにしてofxIBLにカメラとキューブマップのポインタを渡し、マテリアルにはofxIBL::getShaderPtr()を渡します。
1 2 3 4 5 6 7 |
camera.begin(); ibl.begin(&camera, &filteredCubemap); material.begin(ibl.getShaderPtr()); // 描画するオブジェクト material.end(); ibl.end(); camera.end(); |