トップ  >  1. Blenderリリースノート翻訳  >  Blender機能別  >  Blender2.42 レンダーパイプライン
元記事:blender3d.org -- Render pipeline


レンダーパイプライン


by Ton Roosendaal


Blender の レンダーパイプラインが完全に書き直され、実装とワークフローに大きな変更が生じる結果となりました。

このダイアグラムは、アニメーションのレンダリング(Anim ボタン)もしくは画像のレンダリング(Render ボタン)を開始した時、何が起こっているのかを示すものです。Blender 内では、アニメーションレンダリングがループに入ると、画像もしくは動画ファイルが書き出されます。単一の画像レンダリングの場合は、単に復帰し、結果を表示します。
メインブロックはメインパイプラインオプションを感知します。これにより、Sequencer のレンダリング、もしくは3Dレンダリングやコンポジットのチェックが生じます。Sequencer と Compositor の両方では、他の Scene のフルレンダリングが再び起こることがあります。
Scene ごとに、レンダリング結果が格納されます。これは、実際のバッファを格納した「パス」のリストを順次持つ、'Render Layer' のリンクリストです。

API の仕様については、Blender Wikiをお読み下さい

このページは、ユーザ側の説明のみです。


ButtonsWindow でのプレビューレンダー


平面 球

立方体 スザンヌさん
Shading Buttons のプレビューレンダーが、Blender のレンダラそのものを使用するようになりました。従来は自身のシェーディングコードによる別のルーチンを使用しており、プレビューが正しくレンダリングされていないことがありました。
また、新しい Preview パネルはいくつか追加のプレビューオプション(平面、立方体、小さな球、大きな球、モンキーヘッドによる表示)も提供しています。将来的にはレイトレーシングやヘアレンダリングなどのオプションが何個か追加されるでしょう。

ここでレンダリングされているのは単なる Blender の Scene とファイルで、現在、Blender にコンパイルされて入っています。このファイルは BlenderCVS の blender/release/datafiles/preview.blend にあります。



3DWindow でのプレビューレンダリング


3DWindow でもプレビューをレンダリングすることができ、[Shift]+[P]で使用可能な、大きさを変えられるパネルです。
このプレビューは新しいレンダーパイプライン機能を使用し、レンダリングをインクリメンタルに行うことができます。これはつまり、すべてのレンダリングデータ(オクツリーやシャドウバッファも含む)を一度作成するだけですみ、編集後、すばやくレンダリングしなおすことができるということです。キーボードやマウス移動イベント時は、プレビューレンダーがレンダリングのループから外れ、UIのインタラクティブ性を維持します。

現在、この高速再レンダリングの更新は以下の場合でのみ起こります。
- パネルの移動もしくはそのサイズ変更時。
- Material/Texture プロパティの変更時(ただし、まだ Halo と ZTransp への切り替えには対応していません)。

強制的にプレビューの再描画を行うには、[Shift]+[P]を二回押してください。

また、このプレビューレンダーは "Local View" オプション(テンキーの[/])でも使用できます。つまり、選択された Object のみを表示できます。ただし、レンダリングはまだ、オリジナルのレイヤからのライトによって行われます。このオプションはすばやくプレビューレンダリングを行うのに使用して下さい。


レンダリング結果(Render Result)


内部構造ダイアグラムBlender のレンダーパイプラインをよく理解できるように、ここに1回のレンダリング時に生成される、全画像バッファの内部構造の一例のダイアグラムを挙げます。

Scene
例によって、Blender ファイル(別の言葉では、作業中のプロジェクト)は多くの Blender の Scene から成ることがあり、それぞれには独立したレンダリング設定と、共有された(Shared)、もしくは唯一の Object があります。
レンダーパイプラインは、完全に Scene 毎に「ローカル化」されており、それぞれの Scene を個別に、もしくは一律に平行してレンダリングできるようになっています。

RenderResult
Scene のレンダリングの最初のステップのひとつが、RenderResult の作成で、これはすべての RenderLayer と Pass のコンテナであり、コンポジットもしくは Sequence Edit の結果を格納します。それぞれの Scene は自身の一意な RenderResult を取得しますが、複数の RenderResult が同様に Scene 毎に存在することもあります(新しい 3DWindow プレビューで説明されているとおり)。

RenderLayer と Pass
一度3Dのレンダリングジオメトリが作成され初期化されると、パイプラインは連続してそれぞれの RenderLayer の "Pass" をデータで埋める処理を行います。RenderLayer 毎に、そのジオメトリがどうレンダリングされるか(Solid や、ZTransp、Halo など)設定することができます。この Pass は実際の画像であり レンダリング結果の RGBA の「組み合わせ」や、レンダリングの Normal 値など、何でも格納できます。

Compositor を使用する場合、RenderLayer が「RenderResult ノード」のメニューの項目としてあり、その Pass を Output ソケットとして利用できます。

明らかなメモリの制約から離れ、Blender にはもう、1回のレンダリングコマンドでのレイヤやパス数の限界はなくなったのです。


タイルベースレンダリング


効率的かつメモリ節約のできるレンダリングをするため、"Render Result" をいくつかのタイルに分割し、それぞれを自身のスレッドでフルレンダリングしています。これはスレッドレンダリングのより効果的(現在はすべてのレンダリングがスレッドで行われているため)な使用だけでなく、今、このシステムは三つ以上のスレッドにも対応可能になりました(理論上は無制限です…ただし、まだいくつかのレンダーコードは修正しなければなりません)。

パイプラインはデフォルトでは、最初に最終 RenderResult用のすべてのメモリを確保します。そしてここに、それぞれのタイルの結果がコピーされます。新しいオプション "Save Buffers" により、すべてのタイルを(OpenEXR フォーマットを使用し)最初にディスクに書き出します。そしてレンダリングが終了すると、Blender がそのファイルを読み直します。これにより、多くの RenderLayer を使用している時、かなりのメモリが節約可能です。

現在のシステムはまだすべてのレンダリングデータ(シャドウバッファとオクツリーを含む)を、タイルレンダリングが発生する前の、プリプロセスの段階で生成していますが、次の開発段階では、これもタイルシステムへ移動する予定で、真の「バケツ」ベースのレンダリングが可能になります(タイル用のレンダージオメトリが必要になった時点で作成されます)。

好きなタイル数を、RenderButtons 内の "Xparts" と "Yparts" ボタンで指定できます。多くのタイルを使用する時は、オーバーヘッドが生じ、レンダリングが遅くなります。典型的な最適数は、画像ごとにだいたい16から64枚です。


RenderLayer


これは新しいパイプラインの特徴の中で最も人々の関心を引く物で、アーティストにレンダリングで得られた物、特にコンポジット(合成)機能に関連する物の高度なコントロールを提供します。

"RenderLayer" は、Scene をレンダリングするために生成された、3Dジオメトリのサブセットのレンダリングを可能にするものです。よくある状況として例をあげると、前面と背面のレンダリングの分割があり、この場合、その後独立してぼかし、再び合成することができます。
新しいレンダーパイプラインは、このようなレイヤをあらかじめ設定しておくことができ、これらは一度にレンダリングされ、更に処理を行うため、独立した "Image" として Compositor へ送られます。


RenderLayer を設定するメインオプションが二つあります。
- Sky、Solid(不透明) Face、ZTransp(透明) Face、Edge や Halo のレンダリングの指示
- レンダリングすべき "View Layer(可視レイヤ)" の指示

Blender のレンダリングシステムはすでに、Solid Face を ZTransp Face や Halo とは別にレンダリングしています。デフォルトでは、これらはあらかじめ決められた順序(最初に Solid、次に Halo が追加され、その後に ZTransp を追加)で合成されています。RenderLayer オプションの使用により、これらのレイヤを別々に格納し、Compositor で好きな順序で合成することができるようになりました。
ちなみに "Edges" は Z バッファベースなため、Solid Face 時のみ動作するようになったことに注意して下さい。

その名前にもかかわらず、RenderLayer は実際には View Layer とは全く違います。RenderLayer は PhotoShop や Gimp にあるレイヤとみなすこともできますが、View Layer は単に Object もしくは Face の表示フラグにすぎません。
つまり、これは最初に Scene の可視 View Layer を設定する必要があるということで、通常、どの Object 含めるべきかを指示します。
その次に追加のコントロールとして、これらのどの Object を実際にレンダリングするかを、RenderLayer 毎の View Layer の設定により、指示できます。

シャドウとレイトレーシング
シャドウバッファとオクツリー(レイトレースを視覚化するための物)が1回のプリプロセス中に生成されるため、これらは、すべての RenderLayer で指示されているものと全く同じであることを理解することが重要です。
つまり、RenderLayer により、前面と背面を分離することはできますが、それでも、まるでシングルパスでレンダリングされたように画像が合成されます。

サンプル画像では、フロアが View Layer 1、モンキーが View Layer 2、ライトが両 View Layer にあります。この時、二つの RenderLayer が作成され、これら二つの View Layer は別々にレンダリングされます。フロアはこの時もまだモンキーの影を受けたままであることに注意して下さい。なぜなら、シャドウバッファはすべてのジオメトリのために作成され、RenderLayer の指示とは独立しているからです。

また、フロアに Mirror が設定されていた場合、最初の RenderLayer には反射したモンキーが表示されているでしょう。

テスト.blend ファイル(150KB)

Pass(パス)
RenderLayer 毎に、特定のシェーディング結果を格納し、Compositor で更に処理を行うためのオプションを設定することができます。現在実装されているオプションは以下のとおりです。

- "Combined": レンダリング結果の RGBA。
- "Z": Z 値、カメラからの距離がBlender 単位に変換されています。
- "Vec": ピクセルのスピードベクトル。モーションブラー用。
- "Nor": 一つのピクセル中でレンダリングに使用される Normal。

Z 値のみがアンチエリアスされません。(これは理論的には不可能で、あるアンチエリアスされた Edge を正しく描画するために、Z 値を平均化することはできません)。

更なる Pass、特にシェーディングパイプラインからの結果などは、そのうち追加されるでしょう…これがシェーダノード用にどう作用するかはまだ決めていません。

RenderLayer と Pass の UI

1) Scene 表示(View) Layer
念のため書いておくと、ここでは Scene のどの View-Layer が可視で、レンダージオメトリに変換されるかを設定できます。

2) RenderLayer
- ブラウズメニューボタンでは、アクティブな RenderLayer の設定もしくは新規追加ができます。アクティブな RenderLayer はまた、レンダリング後に表示されるレイヤでもあります。
- 名前ボタンで、わかりやすい名前を RenderLayer につけることができます。名前を変更すると、Compositor 内の RenderResult ノードの名前も正しく調整されます。
- "Single" オプションで、パイプラインを強制的にアクティブ RenderLayer にだけにできます。
ー "×" ボタンで RenderLayer を削除します。

3) RenderLayer の View-Layer
ここでは、レンダリングすべき View-Layer を設定できます。ここはその Scene の View-Layer の一部のみです。

4) RenderLayer オプション
RenderLayer では、どの「ジオメトリ」オプションを可視にするか、レンダリングすべきかを決定できます。
このボタンは、現在、Sky、Solid、Ztransp、Halo、Edge を提供しています。

5) Pass
ここでは、ピクセル毎の特定のシェーディング情報の追加ストレージを指示できます。"Pass" は RenderResult ノードの Output ソケットとして利用できます。
(注意:現在、Combined、Z、Vec、Nor のみが動作します。AO、スペキュラ、シャドウなどのシェーディング用の追加のパスコントロールは作業中です)


メモリの問題


映画エレファンツドリームの作成中に遭遇した悩みの一つが、皆さんもご存知のように、32ビットシステムが理論上最大4GBまでしかアドレッシングできないことです。
更に悪いことに、OSX では、Blender のプロセス全体が2GBまでしか使用できず、約1.7GBのみがレンダリングに使用可能だったのです(1バイトでも多いと、スワップの代わりにクラッシュしていたのです!)。

私たちが見つけた解決策は、メモリの確保を二つのセグメントに分けることでした。Blender の UI 自身と、すべてのレンダリングジオメトリを通常どおり確保しますが、レンダリングやコンポジット、Texture 用の画像バッファはディスクベースの「メモリマップ」システムを使用して確保しました。通常、このメモリは違うアドレス空間を使用することで、より多く確保できます。OSX システムについては、この方法で2.8GBまでうまく使用することができました。

メモリ使用量は、Blender のウィンドウヘッダで確認できます。総確保量と、カッコ内に「メモリマップ」に使用されている部分が表示されます。

64ビットには未来がありますが、皆さんのデスクトップにすぐに広まることは期待できません。そのため、この機能はあと数年は便利なままでしょう。

Orange ブログに投稿された記事もお読み下さい

浮動小数点数カラーバッファ
Blender で色やパスの値を確保するすべてのバッファは浮動小数点数となり、バッファに要求されるメモリの使用量が4倍に増えました。これが、レンダリング時に複数のタイルを使用する主な理由の一つで、タイル毎の一時的なレンダーバッファが確保されるだけだからです。
ただし、最終 RenderResult は、下記のオプションが使用されない限り、前もって完全に確保されます。

Save Buffers
このオプションは、レンダリング開始前の最終 RenderResult バッファの確保を禁止します。その代わり、RenderResult のタイルはディスクへ OpenEXR を使用して保存され、レンダリング後、レンダージオメトリが解放された後、そしてコンポジットが開始される前に再度読み込まれます。タイルベースの OpenEXR の保存と読み込みで、レンダリング時間が少し増えますが、2k HDフレームで約15秒程度です。

テクスチャイメージの解放
二番目に大きくメモリを節約してくれる物(訳注:救援者の "Saver" とかけています)は、すべてのイメージテクスチャをそれぞれのレンダリング終了時に解放する新しいオプションでした。このオプションは特に、ミップマップの作成が飛びぬけて高速(20〜30倍)になることから、興味深い物となりました。


パノラマレンダリング


ぱらのまパノラマレンダリングの古い実装は、改造に改造を重ねたものでした。これは "X Parts" 値を画像サイズを水平方向に広げるために使用し、それぞれの X パートでカメラを回転していました。

現在、内部レンダーシステムが完全にタイルベースとなり、パノラマオプションがすべての縦に並んだタイル(=スライス)に自動的に適用されるようになりました。
よって、単に "Pano" ボタンをON/OFFするだけで、不思議なレンズエフェクトがかかります。出力画像のサイズは、パノラマなしの場合と同じままです。

以前はパノラマレンダリング用の最小スライスサイズが、8ピクセルに決め打ちされていました。"X Parts" ボタンを512まであげることにより、それが可能になります。実験的に、64スライス、90度の広角レンズでレンダリングしましたが、すでに非常にいい結果がでています。この時の直線の曲率は256ポイントの Circle と同じでした。

360度完全なパノラマのレンダリングは、非常に広角なカメラを作成することにより行えます。理論的には、Camera の Lens が5で、360度になるはずですが、いくつかの理由により、私のテストでは5.1となりました…どこかに丸め誤差が生じている? もしくはクリッピング平面開始に関する何か? 私たちは後日検証してみようと思います。

また、それぞれの X-Part のスライスで、パノラマエフェクトを補正するため、全データベースをカメラの周囲で回転させる必要があることに注意して下さい。巨大な Scene ではこれがオーバーヘッドとなります。

スレッドレンダリングはパノラマでも上手く動作しますが、同時に(そのY-Parts の)ひとつのスライス内のパーツにしかレンダリングできません。次のパノラマスライスのために、現在のスライスのすべてのスレッドが準備できるまで待たなければいけません。

古いファイルのレンダリング時、古いファイルの設定はできるだけ新しい状態に近くなるように変換されます。
現在コードは、Image size をチェックして、古いパノラマと認識します。もし Image の横(Width)が縦(Height)より小さい場合、古いファイルと仮定します(Panorama オプションが設定されていた場合のみ)。


レンダリング出力表示


レンダリング画像を 3DWindow に描画する古いオプションは削除されましたが、代わりに二つの新しい Output オプションが追加されました。

- Render to Image Window(ImageWindow へレンダリング)
- Render to full-screen Image Window(フルスクリーンのImageWindowへレンダリング)

両オプションは "RenderResult" という一時的なイメージブロックを作成します。この画像はその後、Blender のイメージングシステムの一部になり、更にペイント可能になります!
[Esc]を一度押すと、ImageWindow を押し出し、以前のウィンドウタイプを表示します。

レンダリングの呼び出し時([F12])、下記のルールがこの新しいオプションに適用されます。
- もし現在ある ImageWindow に "Render Result" が表示されていれば、それを使用します。
- そうでなければ:一番大きな Image 以外の場所を探します(つまり、Texture Image や Compositor の Output は使用しないということです)。
- もし、1つのウィンドウしか利用できない場合、それを使用します。

現在、この Render Output オプションには "Spare" オプション([J]キー)がありませんが、画像をリネームすることができるので、新しいレンダラによる物と比べることができます。
また、Curves パネルでも、Alpha/ZBuffer 表示オプションが動作することに注意して下さい。




元記事:blender3d.org -- Render pipeline
Jul 08 2006版を元にしています。
プリンタ用画面
友達に伝える
投票数:31 平均点:10.00
前
Blender2.42 Array モディファイア
カテゴリートップ
Blender機能別
次
Blender2.42 ベクターブラー

ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki