イメージベースライティングの使用
はじめに
Qt Quick 3Dは、シーンや個々のマテリアルを照らすIBL(Image-Based Lighting)をサポートしています。
IBLは、シーンをイメージで照らすことができるライティングテクニックです。これは、屋内や屋外のシーンでリアルな照明や反射を作成したい場合に特に便利です。
IBLにはどのような画像ファイルでも使用できますが、360°HDR(ハイダイナミックレンジ)画像の使用をお勧めします。HDR画像は、例えばJPEGやPNG画像よりもはるかに高いダイナミックレンジを持っています。より高いダイナミックレンジは、非常に明るいものから非常に暗いものまで、幅広い輝度レベルを通して、よりリアルなライティングを提供します。
次の例では、HDR画像と単一指向性ライトを使用した場合の、対象物への照明効果を示しています:
光 | 滑らかな誘電体素材 | 粗い誘電体素材 | 滑らかな金属材料 | 粗い金属材料 |
---|---|---|---|---|
単一指向性光 | ||||
画像ベースの光 |
シーン照明
画像を使用してscene を照らすには、lightProbe プロパティにTexture として画像を追加します。
lightProbe: Texture { source: "maps/OpenfootageNET_garage-1024.hdr" }
画像を選択すると、シーンにIBLが設定されます。シーン内のすべてのモデルは、デフォルトでライトプローブによって照らされます。
注意: IBLを他の光源と組み合わせて、オブジェクトの照明効果を補完することもできます。
シーンにIBLをセットアップしたところで、プローブの様々なプロパティを見てみましょう。多くの場合、デフォルト値で満足のいく結果が得られますが、画像や希望する結果に応じて、以下のプロパティ値を微調整することができます:
- Exposure ライトプローブの発光量。
- Horizon Cut-Off この値を大きくすると、環境の下半分に暗さ(黒)が追加され、照明が主に画像の上部から来るようになります(下半分からの特定の反射は除去されます)。
- Orientation このプロパティは、ライトプローブの向きを定義します。向きは、x、y、z 軸上のオイラー角(度)で定義されます。
プロパティ | 金属材料 | 誘電体材料 |
---|---|---|
デフォルト設定 | ||
露出 | ||
水平カットオフ | ||
オリエンテーション |
マテリアル照明
シーン全体ではなく1つのマテリアルにのみイメージベースライティングを使用する場合、またはイメージベースライティングですでに照明されているモデルに別のライトプローブを使用する場合は、マテリアルのlight probe として画像を設定します。
上記の手順を実行すると、マテリアルに個別のライトプローブが設定されます。このライトプローブは、シーンライトプローブが指定されている場合、シーンライトプローブを上書きします。
IBLキューブマップの事前生成
IBLを使用する場合、IBLイメージ用のキューブマップをアプリケーションで生成する必要があります。デフォルトでは、これはアプリケーションの起動時に行われ、特に組み込み機器やモバイル機器ではかなり時間がかかることがあります。そこで、バルサムを使ってキューブマップを事前に生成することができます。.hdrファイルを入力としてBalsamを実行するだけで、入力と同じ名前で拡張子がktxのCubemapファイルが出力されます。そして、lightProbeプロパティの関連Texture 、このファイルを参照すれば、Qtは実行時にコストのかかる処理をすることなく、事前に生成されたキューブマップを読み込みます。
手動ベイク
例として、アプリケーションがライトプローブやスカイボックスに.hdr画像を使用しているとします:
View3D { environment: SceneEnvironment { backgroundMode: SceneEnvironment.SkyBox lightProbe: Texture { source: "environment.hdr" } probeOrientation: Qt.vector3d(0, -90, 0) } // ... }
これは、environment.hdrが実行時に利用可能であれば、完全に機能します。しかし、.hdr画像を読み込むには高価な前処理が必要です。これは実行することで回避できる:
balsam environment.hdr
結果は新しいファイルenvironment.ktx
。.hdrファイルの代わりにこれを出荷し、Textureソースを変更することで、ロード時間が大幅に短縮されます。
lightProbe: Texture { source: "environment.ktx" }
CMake によるビルド時間の短縮
アセット上で手動でバルサムを実行するのは必ずしも理想的ではありません。そのため、アプリケーションのビルド時に同じタスクを自動的に実行する CMake に依存することをお勧めします。
これは、Qt6パッケージのQuick3Dコンポーネントで提供されているqt6_add_lightprobe_images CMake関数を使用します:
... find_package(Qt6 COMPONENTS Quick3D) ... qt6_add_lightprobe_images(application_target "ibl_assets" PREFIX "/ibl" FILES "environment.hdr" )
application_target
を適切なターゲットに置き換えてください。ここで、environment.hdrに対して手動でbalsamを実行する必要はなくなりました。また、.hdrファイルをアプリケーションに同梱する必要もなくなりました。むしろ、ビルド中にbalsamが自動的に起動され、:/ibl/environment.ktx
のアプリケーションリソースにenvironment.ktxが追加されます。lightProbeのTexture 、このファイルを参照する必要があります。
lightProbe: Texture { source: "qrc:/ibl/environment.ktx" }
注意: PREFIXを設定することで、リソースシステムの最終的な名前が.qmlファイルの場所と一致するパスを持つようになり、qrcスキームで絶対パスを指定する代わりに相対ソースパスを使用できるようになります。
PREFIXに加えて、キーワードBASEも使用できます。動作はqt6_add_resourcesに準じます。例えば、次のようにすると:/ibl/maps/environment.ktx
が生成されます:
qt6_add_lightprobe_images(application_target "ibl_assets" PREFIX "/ibl" BASE "../data/shared" FILES "../data/shared/maps/environment.hdr" )
qt6_add_shadersと同様に、OUTPUTSキーワードを使用することで、リソースシステム内のファイルに完全にカスタムな名前を指定することができます。たとえば、次のようにすると、:/ibl/maps/environment.ktx
も生成されます:
qt6_add_lightprobe_images(application_target "ibl_assets" PREFIX "/ibl" FILES "../data/shared/maps/environment.hdr" OUTPUTS "maps/environment.ktx" )
注: FILES リストの各エントリには、OUTPUTS に対応するエントリが必要です。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。