広告
広告

Eevee の使い方

カテゴリ:blender

Eevee は Cycles と同じ物理ベースのレンダラーだ。ただしパストレーシングの Cycles と違って、Eevee はゲームエンジンで使われるラスタライズ法でレンダリングされる。パストレーシング(Cycles)では自動的に処理されるような表現の一部は、ラスタライズ法(Eevee)ではユーザーが明示的にセットアップする必要がある。

公式ドキュメント(英語)

Blender Cycles vs. Eevee - 15 Limitations of Real Time Rendering in Blender 2.8

目次

サポートするGPU

オーバースキャン

AO(環境遮蔽)

鏡面反射

透過・屈折

皮下拡散(Subsurface Scattering)

間接光・放射(Irradiance Volume)

霧(Volumetric)

セルシェーディング

被写界深度

そのほかのポストエフェクト

制限

サポートするGPU

Supported GPUs in Blender 2.80

Eevee の実行には OpenGL 3.3 以降をサポートする GPU が必要になる。しかし古い GPU は OpenGL 3.3 以降をサポートしていても、ドライバー等のバグのため正しく動作しないことがある。Blender 2.80 では OpenGL 3.3 のサポートに加え、以下の条件を満たした GPU のみサポートする。

macOS

macOS 10.12(Sierra)以降。

NVIDIA

GeForce 200 シリーズ以降、テスラアーキテクチャの Quadro 以降で、OS は Windows と Linux のみサポート。

AMD

HD 7000(第1世代 GCN)以降で、OS は Windows と Linux のみサポート。TeraScale アーキテクチャの HD 2000~6000 は Windows での動作が不安定なのでサポートリストから外されることになった。

Intel

Haswell 以降。製品名だと、Celeron 29xx/G18xx, Pentium 35xx/G3xxx, 第4世代Core i3/i5/i7 4xxx。対応GPU英語)。

オーバースキャン

Eevee のエフェクトのほとんどはレンダリングされた画像を加工し合成することで生成される。しかしこのスクリーン空間エフェクトは画面端で正しい結果にならないことがある。「プロパティパネル > レンダー > フィルム > オーバースキャン」にチェックを入れると、これを解消できる。ただし、より高い解像度でレンダリングすることになるのでパフォーマンスは悪化する。

overscan
オーバースキャン

AO(環境遮蔽)

Cycles はオブジェクト間の距離に基づいて暗さを決定するが、Eevee はカメラからの距離(深度バッファ)を使って暗さを決定する。Eevee の AO は後ろに隠れているオブジェクトや遠くのオブジェクトの影響を考慮しないため、Cycles に比べてグラデーションが小さくなる傾向にある。

Eevee で AO を使うには Ambient Occlusion にチェックを入れ AO ノードを使う。

ao node
基本的な AO の設定

鏡面反射

平面の反射

鏡のような平面の反射は「Light Probe > Reflection Plane」を使えば表現できる。

reflection plane
Reflection Plane を配置するだけで反射する

メッシュの反射

Eevee は平面でないオブジェクトの正確な鏡面反射は計算できない。代わりに球もしくは箱で反射を近似するかスクリーン空間反射エフェクトかのどちらかが使える。スクリーン空間反射エフェクトは動くオブジェクトや動く光源によるシェーディングの変化も反射できるが、スクリーンに映っていないオブジェクトは映らない。Reflection Cubemap はスクリーンに映っていないオブジェクトも反射できるが、リアルタイムで動くものは反射できない。

スクリーン空間反射エフェクトは動画向け、Reflection Cubemap は背景やスチル向けだ。

球もしくは箱で反射を近似する(Reflection Cubemap)

反射するメッシュの位置に Reflection Cubemap を配置してベイクすると、近似された反射が写るようになる。この例ではスザンヌのマテリアルにメタリックを1にしたプリンシプルシェーダを使っている。

bake cubemap
Reflection Cubemap のベイク。Bake Indirect Lighting でも Reflection Cubemap がベイクされる
on
Reflection Cubemap あり
off
Reflection Cubemap なし

Reflection Cubemap は SSR(Screen Space Reflection)と同時に使える。

cubemap plus ssr
Reflection Cubemap + SSR

スクリーン空間反射エフェクト(Screen Space Reflection 以下 SSR)

SSR は Screen Space Reflections にチェックを入れると使える。制限はあるが Reflection Cubemap よりも正確に反射できる。

ssr
SSR

SSR はスクリーンに映っている物しか反射しないことに注意。なのでReflection Cubemap と同時使用を推奨する。ただし環境テクスチャは映る。

ssr warning
奥のキューブはスザンヌの側面を反射すべきだが、それがスクリーン上に映っていないため反射できない

透過・屈折

透過(Transparency)

Cycles の透過はレイのバウンス回数に制限される。その回数を超えると黒くレンダリングされる。

Eevee のアルファブレンドはカメラから見て奥から手前に向かう順番にレンダリングされる。透過オブジェクトの制限数に達すると残りの透過オブジェクトはレンダリングされない。手前のオブジェクトがレンダリングされないのでこれはすぐに気付く。

Eevee の Alpha Clip は逆に、カメラから見て手前から奥に向かう順番にレンダリングされる。ただしブレンドはできず、透過するかしないかのどちらかしか選択できない。

屈折(Refraction)

Eevee の屈折は法線と厚みとの情報からオブジェクト後方の画像をゆがませることで実現している。入射光がオブジェクト内で反射しているわけではないので、複雑な形状では Cycles とまったく異なるレンダリング結果になる。

設定

屈折を表現するにはプリンシプルシェーダの透過を1にして、マテリアルの Screen Space Refraction とレンダータブの Screen Space Reflection > Refraction とにチェックを入れる。

reflaction settings
Reflaction の設定
result

これもスクリーン空間エフェクトなのでスクリーン上に映っていない物は映らない。ただし環境テクスチャは映る。

アルファブレンド

マテリアルで Blend Mode を Alpha Blend にして透過(Transparent)ノードをミックスする。

alpha blend
アルファブレンドの設定

皮下拡散(Subsurface Scattering 以下 SSS)

Eevee の SSS はオブジェクトの厚みと法線とを利用して皮下拡散を近似している。これは人肌のように控えめに使われる場合にはうまく働く。ただし厚みの薄い場所ではディティールが潰れやすい。これはランダムウォーク(Random Walk)法で起こりやすい。

設定

SSS を有効にするにはマテリアルの Screen Space Subsurface Scattering とレンダータブの Subsurface Scattering とを有効にする。

sss
SSS の設定

Subsurface Scattering ノードよりもプリンシプル BSDF の方が SSS の調整はやりやすい。

sss result
SSS は逆光にするとわかりやすい

間接光・放射

Eevee は間接光の情報を Irradiance Volume にベイクすることで GI(Global Illumination)を実現している。なので Eevee の GI はアニメーションしない。ベイクの精度を高くするために Irradiance Volume の解像度を上げると、ベイクの時間が長くなる。Irradiance Volume の解像度は高すぎても低すぎてもアーティファクトが出る。

放射(Emission)やライトがほかのオブジェクトを照らしたり、ほかのオブジェクトが反射した光を表現するためには「Light Probe > Irradiance Volume」を配置する必要がある。

irradiance volume
底面の赤と側面の青がスザンヌに反射している

間接光を計算するにはレンダータブで Bake Indirect Lighting を押す。変更時に自動的に再計算してほしいときは Auto Bake にチェックを入れる。Auto Bake が有効な場合、ちょっとした変更で何度も Irradiance Volume が再計算される。なので Irradiance Volume の調整が終わり次第すぐに Auto Bake のチェックを外した方がいい。

bake
間接光のベイク

注意事項

ライトでなくメッシュの放射を大域的な光源として使うのは推奨できない。Eevee の放射は Irradiance Volume 内しか照らさないからだ。Irradiance Volume が巨大だとその解像度も上げる必要があり、キャッシュの計算に待たされることになる。

Irradiance Volume を使っても放射オブジェクトは影を作らない。ラスタライズ法は影の生成にシャドウマップという、光源ごとに影生成用テクスチャを使う方法がよく使われる。シャドウマップで放射の影を生成するとポリゴン一枚ごとにテクスチャを割り当る必要があり、メモリが不足する。

将来的には OpenGL 版の DirectX Raytracing を使った、リアルタイムレイトレでこの影の問題は解決できる見込みである。もしくは反射・屈折・影の生成にリアルタイムでないレイトレを使う実装も考えられる。

霧(Volumetric)

God Ray のようなエフェクトなら Cycles より Eevee が得意だ。正確ではないがレンダリングは高速でノイズがまったくない。3D テクスチャを使ってリアリティをあげることもできる。

ただし Eevee は厚みのある煙や炎のような光を発するエフェクトは苦手だ。

設定

レンダータブの Volumetric にチェックを入れて、プリンシプル Volume ノードを使うのが簡単だ。Volumetric ノードは Material Output の Volume ソケットにつなぐことに注意

volumetric
Volumetric の設定

メッシュの形の雲を作るノード(英語)

セルシェーディング

Shader to RGB ノードを使う。一部のスクリーン空間エフェクトは反映されない。環境テクスチャやスクリーン空間屈折(Refraction)、SSAO は Shader to RGB ノードで処理できる。そのほかのセルルックエフェクトはEevee のセルルック技法まとめを参照。

Shader to RGB ノードは Cycles では使えない

npr
手前のスザンヌはグラスBSDFを使い、奥のスザンヌはディフューズBSDFを使っている

被写界深度

被写界深度を有効にするにはレンダータブの「被写界深度」にチェックを入れる。被写界深度の設定はカメラで行う。ボケの量を増やすには F-stop の値を小さくする。ピントの位置は適当なエンプティを配置して、Focus on Ojbect を設定する。

settings
被写界深度の設定

ビューポートで被写界深度エフェクト

ビュー > カメラ設定 > アクティブカメラ(Numpad 0)でカメラからの視点に切り替え、サイドバー(N)で「カメラをビューにロック」にチェックを入れる。

lock camera
カメラをビューにロック

Eevee は IBL(環境テクスチャ)で影を生成しない。影が必要な場合はライトを配置するか、Irradiance Volume を配置する必要がある

シャドウマッピング法はテクスチャの精度の問題で厚みのないポリゴンにできる影が不正確だ。室内モデルで厚みのない壁や天井を作る場合は、厚みつけモディフィアをつける等の処理が必要になるかもしれない。また Exponent を上げることで漏れを減少させられる。

light leaking
辺の部分で光漏れが起こりやすい
exponent parameter
Exponent を上げると漏れを減少させられる

ソフトシャドウ

影の方式(Method)を VSM にし、ライトの柔らかさ(Softness)を上げ、Cube Size を下げる。影の品質を上げるために Cube Size を上げるとソフトシャドウができないことに注意する。

soft shadow
影の品質を上げると、影が固くなる

ソフトシャドウオプションにチェックを入れると影の輪郭にぼかしがかかる。ソフトシャドウオプションは Cube Size をあげると重くなる。

soft shadow option
ソフトシャドウオプション

影生成アルゴリズムの VSM と ESM について

VSM と ESM はそれぞれ欠点がある。VSM は影の中に影が落ちると、影の輪郭が明るくなるライトブリーディングという欠点がある。なので背景のような、高さの異なる複数のオブジェクトが配置されるシーンでは VSM の使用を避けた方がいいだろう。

ESM は影に欠損ができることがあり、光が漏れやすいという欠点がある。

ESM と VSM を組み合わせた EVSM もしくは MSM(Moment Shadow Map)実装されれば、それが一番いいのだが。

Exponential Shadow Map(ESM)

ESM は影かどうかを0か1かで判定するのではなく、その境界を指数で補間する。補間に失敗して影に欠損が発生することがある。

cutout
オブジェクトの端にできた影の欠損

加えて VSM に比べて光が漏れやすい。

esm light leak
ESM
vsm light leak
VSM

Variance Shadow Map(VSM)

VSM は影かどうかを0か1かで判定するのではなく、チェビシェフの不等式を使って確率的に求める。影が重なるところで、影の輪郭が明るくなるライトブリーディングが発生する。

light bleeding
影の中に影が落ちるとその輪郭が明るくなる

VSM は影にノイズが乗りやすい。VSM を使う場合は High Bitdepth のチェックが必須だろう。

Contact Shadows

光が漏れたり、オブジェクトの接地部分に影ができない場合は、ライトの Contact Shadows にチェックを入れると改善される。

demo
Contact Shadows を有効にすると接地部分に影ができる

しかし Contact Shadow は視点によっては表示されないことがあり、ちらつきが気になることがある。

flicker
Contact Shadow のちらつき

外部リンク

中級グラフィックス入門~シャドウマッピング総まとめ~

カスケード シャドウ マップ

そのほかのポストエフェクト

カメラの前にガラスを配置し、Shader to RGB を使うことでポストエフェクトをかけられる。ただし以下の制限がある。

  • ガラスや透過オブジェクトをうまく処理できない
  • 屈折に距離制限があり、背景が映らないことがある
  • 色情報しか取得できないので、エフェクトの種類に制限がある
  • シェーダ上では、ぼかしや各種フィルターノードが使えない

設定

屈折を有効にして、Shader to RGB で色を取得する。後は取得した色を加工するだけだ。

settings
設定

制限

カメラ

透視投影と平行投影のみサポートしている。

ライト

Dupli Ojbect やグループインスタンスで複製したライトは影を作成しない。

シーン内で有効なライトの数は 128 が上限になる。それ以上のライトが存在している場合、ライティングされないライトが出てくる。

影を生成するサンライトは同時に8つまでしか配置できない。

ライトは単色のみサポートしている。今のところライトノードはサポートしていない。

Light Probes

有効な Reflection Cubemap の個数の上限は 128 個。

有効な Irradiance Volume の個数の上限は 64 個。

カメラ内で有効な Reflection Plane の個数の上限は 16 個。

間接光

Volumetrics は Irradiance Volume を無視する。しかしワールドのディフューズライティングの影響は受ける。

スペキュラからディフューズやスペキュラからスペキュラへの光の反射はサポートしてない。Irradiance Volume のベイクの間は、全てのスペキュラライティングは無効になる。

Volumetrics

サポートしている scattering は1つだけ。scattering を複数使ってノードを組んでも、使われるのはそのどれかひとつだけだ。

Volumetrics は Irradiance Volume を無視する。しかしワールドのディフューズライティングの影響は受ける。

Volumetrics はカメラレイにのみ対応する。反射/屈折/Light probe には映らない。

Volumetrics shadow はほかの Volumetrics にのみ影を落とす。なのでシーン内の他のオブジェクトには影を落とさない。

Volumetrics shadow はカメラに映っている volumes でのみ機能する。

Volumetric ライティングはライトの形を無視する。ライトは全て点光源として扱われる。

Screen Space Reflections

Screen Space Reflections が機能するのはマテリアル内の光沢BSDFのうちのどれか一つだけ。現状では選択される光沢BSDFを指定できない。

one glossy
オレンジの光沢BSDFが反射していない

Screen Space Reflections は透過オブジェクトや SSR を使うオブジェクトを映せる。しかし深度バッファが1つしかないので正確な位置を反映しているわけではない。

Screen Space Refraction

正確に計算できるのは最初の屈折だけ。

Ambient Occlusion

オブジェクトが無限の厚みを持つと仮定している。Distance パラメータが大きいとき、暗くなりすぎる傾向にある。

マテリアル

屈折

光沢BSDFと同じ reflection probe を使って屈折を表現している。違いは反射した視線ベクトルではなく屈折した視線ベクトルを使っていることだ。正確に計算できるのは最初の屈折だけで、2回目以降の屈折は Refraction Depth を使った比較的薄いオブジェクトを利用して計算される。

バンプ

今のところバンプマッピングは OpenGL の derivatives 関数を使って実装されている。これは1ピクセルごとに計算されるのではなく、2x2 のピクセルで同じ値になる。そのためバンプの出力はブロック感が目立つ。なので法線マップの使用を推奨する。

バンプがどうしても必要な場合は2倍の解像度でレンダリングして、出力する際に 1/2 に縮小する。

Volumes Objects

Object volume シェーダはポリゴン内ではなく境界ボリューム内のオブジェクトに影響を与える。volume の形はシェーダ内でプロシージャルテクスチャを使って調整するべきだ。

シェーダノード

BSDF ノードは近似されているので Eevee と Cycles とで小さな違いがある。

Sky Texture 等のいくつかのユーティリティノードは Eevee と互換性がない。

サポートリストはNodes Support を参照。

メモリ管理

巨大なシーンをレンダリングする場合、GPU のメモリが不足して Blender がクラッシュすることがある。レンダリングに必要なメモリサイズを計算する方法は現状存在しない。

CPU レンダリング

CPU レンダリングはサポートしない。

マルチGPU

現状ではマルチ GPU はサポートしてない。

ヘッドレスレンダリング

ディスプレイマネージャを使わずにレンダリングするヘッドレスシステムは現状サポートしてない。

そのほか

カメラのモーションブラーのみサポートしている。

関連記事

Blender 記事の目次


広告