Search Unity

Spotlight チームのベストプラクティス ― 現実のようなビジュアルを Unity で作成しよう

, 3月 9, 2018

私は Spotlight チームの一員として、数々の興味深いプロジェクトに関わることができることを幸運に思います。Unity の Spotlight チームは、お客様と共にゲームの開発に携わらせていただいています。私の主な役割は、デベロッパーの皆様が目標とするビジュアルや品質の実現に向けてサポートすることです。業界の多方面から私の元へ様々な情報が集まって来ますので、コンテンツ制作者が頻繁に直面する問題を私はある程度把握することができます。私がこれまで関わらせていただいたプロジェクトのいくつかは、現実世界のようなビジュアルを目標とするものでした。Unity で、プロジェクトのアートコンテンツに合わせて、現実的で説得力のあるビジュアルを持つシーンを作成するには、どうしたら良いのでしょうか。

真に迫る現実的なビジュアルを作成するためには考慮しなければならない要素が数多くあります。本記事では、ライティングとレンダリングの設定についてお話したいと思います。記事中ではサンプルシーン『Spotlight Tunnel』を使った学習および実験を行う方法をお伝えします。

Unity のレンダリング設定を準備する

現実世界をリアリスティックに再現するためには Unity のレンダリング機能をどのように使用したら良いか、それを理解することでプロジェクトの目指すビジュアルの実現に一歩近付きます。

リニアレンダリングモード
簡潔に言うと、モニターに最適な出力形式への変換を行う前に物理的に正確なライティングおよびシェーディングの計算が行われるように設定するものです。

リニアワークフローかガンマワークフローの指定を行うには、
メニューから Edit > Project Settings > Player の順に選択して Player Settings を開いてください。
次に Player Settings ウィンドウで Other Settings を開き、RenderingColor SpaceLinear に設定してください。

色空間の定義は、最終的なシェーディングとライティングに劇的な影響を与えるため、プロジェクトの早期に決定すべき事項のひとつです。

レンダリングモード
サンプルシーン『Spotlight Tunnel』では、デファードレンダリングパスを使用しています。これを使用すると、Unity 2017 以降のバージョンで、複数の動的ライトを効率的に扱ったり、複数のリフレクションキューブマップを組み合わせたりすることができるようになります。また既存のスクリーンスペースリフレクション機能の使用も可能になります。

この設定を行うには、Graphic Settings > Rendering Path or Camera > Rendering Path の順に選択してください。

各種レンダリングモードに関する詳細は、Unity マニュアルのこちらのセクションでお読みいただけます。

高ダイナミックレンジ(HDR)カメラ
現実のようなライティングをレンダーする場合、現実世界とほぼ同様に、1 より高い輝度(HDR)を持つライティング値と放射性(Emissive)サーフェスを扱うことになります。そして、これらの値は画面で表現できる範囲に適切にリマップされなければなりません(これはトーンマッピングと呼ばれます)。この設定は、Unity のカメラがこれらの高い値をクリップせずに処理できるようにするために非常に重要です。

これを有効にするには、シーンのメインカメラを選択し、そのカメラの Inspector タブで HDR にチェックマークを入れてください。

HDR ライトマップ符号化方式(オプション)
サンプルシーン『Spotlight Tunnel』ではベイクしたライティングは使用していませんが、強度の高い(HDR)ベイクしたライティングを使用する場合は、ライトのベイク結果を一貫したものにするために、ライトマップの符号化方式を HDR ライトマップに設定することをお奨めします。
このオプションは、メニューの Edit > Project Settings > Player Settings > Other Settings > Lightmap Encoding にあります(Unity 2017.3 以降のバージョンのみ)。
ライトマップ符号化方式に関する詳細は Unity マニュアルでご覧いただけます。.

シーン用の Tonemapper(ポストプロセッシングスタックの一部)
HDR ライティングを正常に表示するには、プロジェクトで Tonemapper を有効にする必要があります。
アセットストアで入手可能なUnity ポストプロセッシングスタック(バージョン 1)を事前にインストールしてください。

プロジェクト内に Post Process Profile Asset を 1 つ作成し、以下のように設定してください。

  • Color Grading > Tonemapper > ACES を有効にしてください。
    (Academy Color Encoding Standards;アカデミー色符号化仕様)
  • Dithering(ディザリング)を有効にしてください。Dithering によって、HDR シーンからの、各チャンネル 8 ビットの出力によるバンディングアーティファクトの発生が抑制できます。最近のエンジンはこの技術を使用して 1677 万色出力時の制約を回避しています。この時点では、Tonemapper のその他の設定はそのままにしておいてください。
  • 「Main Camera」を選択し、Post Processing Behaviour コンポーネントを追加してください。
  • 上記で作成した Post Process Profile を Profile スロットにアサインしてください。ポストプロセッシングスタックのバージョン 2 を使用したい場合は、パッケージの README をご参照ください(現時点ではベータ版であるため)。
  • ビューポートのイメージエフェクトを有効にしてください。
    これにより、シーンビューでの作業中に常に Tonemapper が確認できるようになります。
    トーンマッピングされたシーンでは、ハイライトの演出と、暗いトンネルの色値の分離が改善されています。トーンマッピングを使用していないシーンでは、ハイライト部分の色が周囲と一体化していないのが確認できます(ここでは、照り付ける太陽光が黄色っぽくなっています)。

この設定は基本的に、露出の固定されたデジタルカメラ(露出調整や眼の調整の機能が有効になっていない状態)でシーンをキャプチャーするのと同じ状況を再現しようとするものです。

ここまでの時点で、幅広いコンテンツで現実のようなビジュアルを表現するための、シーンの基本的なレンダリング設定が完了しました。

ライティングと設定

Unity は、様々なライティング手法、ライティングシステム、プロジェクト条件に幅広く対応しています。Unity マニュアルのライティングモードと設定に関するセクションで、全てのオプションに関する解説をお読みいただけます。

しかし、迅速なイテレーションを簡単に行えるようにするためには、レスポンシブな視覚的フィードバックが欠かせません。
このため、サンプルシーン『Spotlight Tunnel』では、リアルタイムライティングにリアルタイムグローバルイルミネーション(GI)を使用しています。これにより、多彩なスペキュラー反応と質の高い反射光ライティングが得られるようになり、ライトの修正をその場で行えるようになります。

リアルタイム GI とライトプローブを使用したリアルタイムライティング


それでは、ライティングそのものについて見て行きましょう。一般的なシーンの、日中の屋外エリアにおけるライティングは、次の 3 つのライティングコンポーネントに分解することができます。

  1. 半球(空からのライト)
  2. 直接光(太陽や局所的なライト)
  3. 間接イルミネーション(GI ライティング)

ここからは、メッシュにテクスチャが適切に設定され、シーンの組み立てが完了している段階にある想定で話を進めて行きます。

屋外のライティングと設定

半球ライティング
屋外ライティングの最初のコンポーネントは、半球ライティングです。これは Unity では Environment Lighting と呼ばれ、簡単に言うと空の光のことです。夜空が寄与する光は最小となり、日中の空が寄与する光は極めて明るくなります。半球の設定は Lighting タブ内(Window > Lighting > Settings > Environment)で行えます。
最初は、HDRI キューブマップではなくプロシージャルスカイボックスマテリアルから開始するのが賢明です。プロジェクト内で新規マテリアルを作成し、それを SkyMaterial と名付けて、Skybox/Procedural に設定してください。

これを、Lighting タブ > Scene 内にある Environment の Skybox Material にアサインしてください。

シーンにいくらかライティングが施されました。環境光として全体的に照らされていますが、あまり正確な半球ライティングとは言えません。しかし現時点ではこのままにしておきます。

ディレクショナルライト
一般的に、太陽光や月光は、ほぼ無限遠の距離にある 1 つの光源から照射され、ライトの方向もシャドウも平行した状態になります。太陽光や月光は通常、ディレクショナルライトで表現されます。

間接イルミネーション/グローバルイルミネーション(GI)
ディレクショナルライトと環境光だけでは、現実のようなライティングは作れません。しっかりした半球ライティングには空の光のライティングのオクルージョンが必要です。また、物に当たった太陽光の反射もシーン内でシミュレートする必要があります。この時点では、空はシーン全体にひとつの色値をレンダーしているため、均一的な印象になってしまっています。ここで必要となるのが、オクルージョンや間接反射光ライティングの計算を行う、リアルタイムグローバルイルミネーションか、ベイクしたライティングです。これを行うには、下記の手順に従ってください。

  • リアルタイム GI やベイキングに寄与する必要のあるメッシュ全てに、必ず Enable Lightmap Static および Reflection Probe Static のフラグを追加するようにしてください。一般的には、大きな静的メッシュがこれに当たります。
  • 次に、Lighting タブ > Scene > Realtime Lighting で Realtime Global Illumination を有効にしてください(デフォルトの「Medium」の設定のままにしてください)。
  • 「Generate Lighting」を押すか、「Auto Generate」にチェックマークを入れてください。

ライトの生成が完了すると、シーンが暗くなってしまいました!それだけでなく、シーン内の一部の要素が周囲から不自然に浮いた印象になっています。路面電車と背景の扉にご注目ください。
この時点では、シーン内の静的オブジェクトには、半球に対する適切なオクルージョンと、ディレクショナルライトからの間接反射反応がある状態です。しかし、それ以外のオブジェクトには適切なライティング設定がされていません。

ライトプローブとリフレクションプローブ
動的オブジェクトや非ライトマップオブジェクトが、リアルタイムあるいはベイク済のグローバルイルミネーションを受けるためには、シーン内にライトプローブを配置する必要があります。動的にライティングされるオブジェクト(プレイヤーなど)が配置された(または通過する)領域の近くに、効率的にライトプローブグループを分布させてください。ライトプローブグループに関する詳細は、Unity マニュアルのこちらのセクションでご確認いただけます。
「Generate Lighting」を再度押してください。または、「Auto Generate」にチェックマークが入っている場合は、事前計算の完了を待機してください。
路面電車と背景の扉は周囲に溶け込みましたが、反射がまだ不自然な状況です。空の反射がトンネル内にまで表れてしまっています。ここでリフレクションプローブの出番です。必要に応じて適切な範囲にリフレクションプローブを効率的に配置しましょう。上のシーンでは、中央のメインの部屋に 1 つ、各トンネル内部に 2 つずつで事足ります。
一般的な基準としては、キューブマップの解像度(Resolution)を 128 ピクセルに設定して立方体投影(Box Projection)を使用すれば、反射のベイク時間やメモリの消費を抑えることができます。
リフレクションプローブに関する詳細はこちらをご覧ください。.
ここまでの作業で、シーン全体に自然なまとまりを持たせることはできました。これは現実世界のような説得力のあるシーンを作るためには重要な要素です。しかし、全体的に作業前よりも暗くなってしまい、今のままではまったく説得力のあるビジュアル品質とは言えません。

HDR ライティングの値
半球ライティングと太陽光は、実際には、我々コンテンツ制作者の多くが想像するよりも遥かに明るい光源です。これらの光源の明るさは 1 よりずっと高い値になります。ここで HDR ライティングの出番です。

試しにディレクショナルライトをオフにして SkyMaterial Exposure を 16 に設定してみてください。
こうすることで、適切な半球ライティングがシーンにもたらす影響を確認することができます。
シーンがより現実味をもって見えるようになってきました。これは、太陽光が完全に空で拡散されていて、したがってディレクショナルライトのない、つまり曇りの日と考えてください。

ここで、太陽光を大幅に高い値で再投入してみましょう。まず Intensity を 5 に設定してみます。太陽光がほぼ白く見えていますが、ディレクショナルライトの色は適切に選択することが重要です。なぜなら、強い太陽による間接色の影響で、シーンの見た目が劇的に変わってしまう可能性があるからです。
太陽(ディレクショナルライト)が、現実世界と同じように高エネルギーの光に見えるようになりました。シーンがかなり現実らしさを帯びてきました。

スクリーンスペースアンビエントオクルージョンとスクリーンスペースリフレクション
シーンのライティングはここまででかなり改善されましたが、ディティールを追加することで更にクオリティを上げることができます。通常は、詳細なオクルージョンのベイキングは行うことができません。これは、パフォーマンスを維持するためにリアルタイム GI の解像度に制約が設けられるためです。そこで役立つのが、スクリーンスペースアンビエントオクルージョン(SSAO)です。Ambient Occlusion の下の Post Process Profile 内で SSAO を有効に設定してください。この例では Intensity が 0.5、Radius が 1、Medium Sample count が Downsampling に設定され、Ambient Only にチェックマークを入れてあります。

追加で発生する環境光ライティングのオクルージョンは SSAO が処理してくれますが、反射に関しては、単純なリフレクションプローブのままではなく、精度を向上させる余地がありそうです。
これを行うには、レイトレーシングによるスクリーンスペースリフレクションが役立ちます。ポストプロセスプロファイルで Screen Space Reflection を有効にしてください。
湿った線路の左側では明るい反射がレンダーされなくなっています。これは SSR のおかげで画面上にあるオブジェクトの反射がより正確になったからです。これら 2 つのポストプロセッシングエフェクトは両方ともランタイムでのパフォーマンスコストを発生させますので、必要な場合にのみ有効化し、ご自身のプロジェクトにおけるランタイムパフォーマンスの制約に合わせて画質設定を行ってください。

フォグ
ここまでで、露出の固定された状態で、屋外・屋内の値の分離を行うことで幾分現実的なシーンとなりました。暗い屋内領域では、強いハイライトと深くくすんだ色値によって反射が表現されています。

しかし、深い奥行きを表す要素があるにも関わらず、手前と奥の要素が見えにくくなっています。これに関しては、シーン内に微かなフォグを加えることで大きな変化をもたらし、シーンにより奥行きを持たせることができます。

フォグなしのシーンと比較すると、手前の柵がより鮮明になっています。
フォグは、Lighting タブ > Scene > Other Settings で有効にできます。この例では Fog color が #6D6B4EFF、Density が 0.025 に設定され、Exponential が有効になっています。Unity 2017 のデファードレンダリングでは、自動で有効になっていない場合に、ポストプロセスプロファイル内でもフォグを有効にしなければならない可能性があります。

屋内および局所的ライティング

スポットライトとポイントライト
リアルタイムの局所的ライティングの定番はスポットライトとポイントライトです。エリアライティングは、2018.1 ベータ版で公開された高画質スクリプタブルレンダーパイプライン(HD SRP)を使用している場合以外は、ライティングをベイクする場合にのみ使用可能です。HD SRP モードでは、リアルタイムでレンダー可能な新しいエリアライトが使用できます。

基本的にこれら 2 種類のライトは、空間内の 1 点からライトを照射し、範囲の制限を持っています。スポットライトの場合はこれに角度の制限も加わります。ライティングに関する詳細は、Unity マニュアルの関連セクションをご参照ください。

この 2 種類のライトの大きな相違点は、シャドウの落とし方とクッキーとのインタラクト方法に関連しています。ポイントライトのシャドーイングにはシャドウマップが 6 つ必要ですが、スポットライトの場合は 1 つです。このため、シャドウを落とすポイントライトは大幅にコストが高くなるので、使用は極力控えることが推奨されます。

(注)ベイクされたライトに関しては、この問題はありません。
もうひとつの違いは、スポットライトのクッキーテクスチャ―は単純な 2D テクスチャーであるのに対し、ポイントライトには(通常 3D ソフトウェアで作成される)キューブマップが 1 つ必要になることです。

ライトの色と強度
説得力のある表現を実現するための適切なライトの色と強度の選択は、一定のおおまかなガイドラインに沿って行う必要があります。

屋内のライトの強度を選択する際は、どの屋内ライトにも太陽より高い強度を持たせないようにしてください。屋内ライトが太陽より高い強度を持っていると、シーンによっては見た目のバランスが悪くなります。例えばこのサンプルシーンの場所でも、日中の明るさを超えるほどの強い光が天井から照らされるような状況はほぼ考えられません。

色を選択する際は、できるだけ、どのカラーチャンネルも完全に除外しない(値を 0 にしない)ようにしてください。除外するとホワイトポイントに達することのできないライトが作られてしまいます。

技術的には使用可能なライトの色ですが、左の画像のライトの色は、最終出力から青色の成分を取り除いてしまいます。シーンの基準となる最終的なカラーパレットを限定的なものにするのはあまり賢明ではありません。後にカラーグレーディングを行いたい場合はなおさらです。

Emissive サーフェス
Unity では、リアルタイム GI やベイクした GI が有効になっていれば、Emissive(放射性の)サーフェスをライティングに寄与させてエリアライティングの効果を表現することができます。これは特に、リアルタイム GI が有効の場合に役立ちます。デベロッパーは、(事前計算が行われれていれば、)Emmisive サーフェスの強度と色を修正したそばから即座にフィードバックを得ることができます。
上の画像では、天井のメッシュから発せられる微かな拡散ライティングが確認できます。

サンプルプロジェクトファイル

Unity サンフランシスコの Spotlight チームは、コンテンツ制作者がハンズオンで学習と実験を行えるように、サンプルシーン『Spotlight Tunnel』を作成しました。

サンプルシーン『Spotlight Tunnel』のプロジェクトファイルはこちらからダウンロードしてください。

プロジェクトをフォルダーに展開し、Unity でプロジェクトを開いてください。

『Spotlight Tunnel』プロジェクトは Unity 2017.1.0f3 を使って作成されています。

Unity 2017.1.0f3 より新しいバージョンの Unity でこのプロジェクトを開く場合は、異なるバージョン間でライティングのデータ形式の互換性がない可能性があるため、ライティングのリビルドが必要となります。

本プロジェクトに含まれるすべてのアセットは、Unity エンジンを使用して開発されたプロジェクト内でのみご使用いただけます。

冒頭でもお伝えした通り、現実のようなビジュアルを作るためには、この他にも理解しなければならない事柄が沢山あります。こちらのチュートリアル(英語)で、本トピックに関して詳しく学ぶことができます。また、Unity マニュアルに完全版ベストプラクティスガイド(英語)も公開予定です。是非お楽しみに!

さあ、限界を超える一歩を踏み出してみませんか?

本記事が、Unity で真に迫るビジュアルの実現を目指すコンテンツ制作者の皆様の役に立てれば嬉しく思います。皆様の素晴らしい作品を拝見できることを楽しみにしています。

24 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Ignis Incendio

    3月 20, 2018 7:06 pm

    Hey there! I’m trying to apply the concepts I’ve learned here to an outdoors scene, but the sun and ambient light always seems too bright, filling the screen with white, if a brightness value of more than 1 is used. The only way I’ve been able to get it back down to believable levels is to use Eye Adaptation + Tonemapping (ACES). Is that what I’m supposed to do, or am I doing something wrong? Thank you!

    1. Rinaldo Tjan

      3月 20, 2018 9:46 pm

      You certainly need Tonemapping.
      What happened is that the lighting energy is correct, however the exposure in this scene is fixed and not set for outdoor open area.
      I’m guessing if you set your exposure in your exterior scene to be around -3 in Color Grading tab, the lighting would be more acceptable. Eye adaptation certainly can come in handy if you have to traverse for complete open and interior scene such as the SpotlightTunnel Scene.
      In the article, eye adaptation is purposely not explored because of the need to understand and tier the scene lightings in EV Zones.
      That would be another topic that I would like to write sometime in the future if time allowed.
      Hope this helps.

      1. Ignis Incendio

        3月 21, 2018 7:18 am

        Thank you, that helps a lot!

    1. Rinaldo Tjan

      3月 12, 2018 6:10 pm

      Thank you for reading the lighting strategy part of the tutorial.
      Lighting strategy often get overlooked and it can mean a difference in fitting your game performance in the target hardware with minimum visual quality compromise.
      There are more lighting strategy that can be done in Unity not mentioned in that tutorial, especially in baking setup to maximize performance with different quality trade off.

  2. This should be the default rendered set on every Unity project. As soon as you create a project as the user if he’s making HD/Console/Desktop project or Mobile project and tune all this settings on automatically. It will make Unity more “out of the box” and gave users better instant look and feeling.

    1. it is, if you open a new project with the ultra template.

    2. Rinaldo Tjan

      3月 12, 2018 6:00 pm

      The template profile hippocoder mentioned is implemented in Unity 2018.1.

  3. Rinaldo, would you please do a follow up article using exactly the same scene but tuned for a VR experience?

    1. Rinaldo Tjan

      3月 12, 2018 5:57 pm

      Great idea will certainly consider it for the future.
      The principal of the lighting will be the same and the scene is pretty simple and lightweight, so I don’t expect performance issue.
      However some changes in the post process settings might be needed to accommodate some VR expectation (motion blur, anti-aliasing).
      So give it a shot if you got VR system handy.

  4. One thing which is often missed even by experienced content creators, is that the blue sky itself can’t be used as a skylight. Why? Because the sky looks blue but it actually emits very little blue light. This is easy to test. Put a blank A4 paper under the real sky on a cloudless day. What color does the paper have? Blue-ish or completely white? Now do the same in unity and check the color of the digital piece of paper. It suddenly looks blue. Therefore you should use a white skylight and the blue part should just be used for the background, not for lighting.

    1. Rinaldo Tjan

      3月 10, 2018 9:25 am

      Unfortunately, your assumption is incorrect whether its for Unity or any high dynamic range image based lighting engine/renderer out there.
      Simple way of testing it, is to bring mirror ball out in the field on a clear day “with no cloud”.
      Did the ball reflect white sky or blue sky?
      There are many factors that can cause your Unity project or renderer to render blue sky environment lighting to be too blue.
      Typical scenario usually involves wrong tone mapper setup or working with Low dynamic range mode.

      Another issue with the white paper test, is the fact that human brain does advance processing that alter our color perception.
      There’s a good explanation with examples on this perception called “Color Constancy” in wikipedia.
      https://en.m.wikipedia.org/wiki/Color_constancy
      Hope this helps clarify the confusion.

    2. You’re making an incorrect conclusion from your observation: it doesn’t look blue because your mind auto white balances.
      Try this: look at a white screen in a room lit green, the screen will be magenta, also turn of white balance in your camera and take a snapshot.
      So the correct way to emulate this is to produce a realistic environment and color correct it with the post processing stack.

  5. Doug Richardson

    3月 9, 2018 10:58 pm

    I tried to create a Procedural Skybox material as described in both 2017.3 and 2018 beta 10 but noticed that the settings are different. In particular, HDR Exposure (which you set to 16) appears to have been replaced with Exposure, which only allows a range from 0-8. Am I missing something?

    1. Rinaldo Tjan

      3月 9, 2018 11:43 pm

      Thanks for pointing this out.
      I can certainly replicate the discrepancies between the older version vs newer version of Unity.
      Bug is filed for this issue by the QA and we’ll keep you informed.
      In the mean time, if you’re stuck with Exposure 8, under lighting tab > Scene > Environment Lighting > Intensity Multiplier > Set it to 2. It’s not ideal, but will give you somewhat similar result.

      1. Rinaldo Tjan

        3月 10, 2018 1:39 am

        Upon further inspection. I have mistaken the use of Skybox-Procedural.shader from Unity Standard Assets vs the one that’s natively built in Unity Empty project (as you’ve spotted, they’re not identical).
        I’ve update The Spotlight Tunnel sample project to include the missing shader and update the material to match the documentation version.
        Please re-download the project from the same link above to get the latest one.
        Once again, thank you for pointing this issue.

  6. Great article, very useful, even for an old user of Unity. Thanks

  7. Thanks for the post, lighting is the most important and hardest aspect of content creation in many regards.

    1. Rinaldo Tjan

      3月 10, 2018 3:21 am

      I’m curious what your opinion will be regarding lighting after reading this post.
      It will certainly be a useful feedback for us to improve.

      1. Every time I see a post like this , I improve my understanding of lighting, things like that are very usefull for me, what I would like to see ( because there is a few information on the topic) is a good looking lighting project with a low cost price, for mobile projects

        1. Rinaldo Tjan

          3月 12, 2018 6:41 pm

          Mobile can mean a lot these days. Some newer devices are very powerful and can actually run this sample project in its current state.
          However, in terms of optimization for mid-tier mobile hardware, there’s certainly a few things that can be done:
          – Converting the lights to be baked (disable Realtime GI since it’s no longer needed if lights are baked).
          – Switch the renderer to forward (be careful with reflection probe coverage since forward has limitation of reflection blending, you’ll also lose the ability to use Screen Space Raytrace Reflection).

          These two alone should be sufficient to make this scene performant on mid-tier mobile hardware.
          Additional optimization would be texture size reduction if memory is a concern.
          The rest of the lighting concept and fundamentals would be the same.

  8. Greate article! A lot can be learned from this.

  9. Thank you! That’s always great to read such best practices from Unity.

    1. Rinaldo Tjan

      3月 9, 2018 6:22 pm

      Glad you enjoy the post. Don’t forget to check out the full coverage in the tutorial section: https://unity3d.com/learn/tutorials/s/creating-believable-visuals