Blender で使えるRay Portal BSDFは、レイトレーシングに基づいたポータル効果を表現するためのシェーダーです。これを使えば、光線を特定の位置へ転送することで、空間にポータルを出現させて違う空間を映し出したような視覚効果を作り出せます。
ある場所を別の場所に映し出すだけならばある程度単純に使うこともできますが、視線方向に固定されたポータルしか作れません。ドライバーを使ったり、映し出す平面オブジェクトの接空間を利用することでこのポータルを自由に持ち運べるようになります。が、それぞれに制限や使い方があり工夫が必要です。
異世界を映し出すポータル表現は、特殊な状況の他にも、テレビ画面やモニタなどに映ったシーンの表現などにも使えます。
本記事では、Ray Portal BSDFを使ったポータルの作り方、面の向きに追従するポータルを実現する方法を紹介します。少し難しい内容もあるかもしれませんが、シェーダーのノード構成と、背後にある空間変換の考え方も含めて、わかりやすく解説していきます。ノードが組めれば誰でも再現することが可能です。
この記事は、BlenderのRay Portal BSDFの使い方と、回転・移動自由なポータルの作り方を解説した中~上級者向けの記事です。
難易度
Ray Portal BSDF ノードとは?
Ray Portal BSDFは、「光(カメラレイ)をシーン内の別の場所にワープさせる」ことができる特殊なシェーダーノードです。ポータルのような視覚効果や、トリッキーなレンダリング演出をする際に使えます。
- Color(カラー)
ポータルを通過する光線に色を付けます。ポータルの向こうの空間に色がつきます。

- Position(ポジション)
光線がポータルを通過した後、どこから再スタートするかを決める座標です。指定しない場合は、現在の位置(=Geometryノードの「Position」出力と同じ)が使われます。

上の図の場合、平面のPositionがX方向に1.6、Y方向-1.5、Z方向-0.5に動いたようにその空間を映し出している(厳密には平面を通ったカメラレイが移動した想定)
- Direction(ディレクション)
光線がポータル通過後に向かう方向を指定します。
指定しない場合は、現在の視線方向(=Geometryノードの「Incoming」の反対向き)が自動的に使われます。


このノードは、基本的に透明なTransparent BSDFに似た動作をします。つまり、ポータルを通るカメラレイの光線はそのまま通過するように扱われ、「透明バウンスの最大数(Max Transparent Bounces)」の設定にも影響されます。
使い方の注意点
- Ray Portalは一方向通行です。
光線は「入る→出る」だけで、「戻る」ことはできません。
もし双方向に行き来させたい場合は、出口側にももう1つポータルを置く必要があります。 - 光のサンプリングはポータル越しでは効率が落ちます。
そのため、ポータルの向こう側にある光源からの光がノイズになりやすくなります。
特に小さなライト(ポイントライトなど)は通過しづらく、ノイズが増えるか、全く反映されないことがあります。
ポータルの作り方
3種類のポータルを紹介します。全て平面ポータルです。
- 通常のポータル
- Emptyで制御するポータルです。スタンダードに別の空間や景色を映し出すときに使えるポータル。
- 接空間を利用するポータル
- 平面にはりついている接空間を利用するポータル。回転時に条件や制限がありますが適切に設定すれば使えます。
- ドライバーを利用するポータル
- 平面の回転をドライバーを利用して補正することで自由に持ち運びできる、オブジェクト追従型のポータル。ドライバーを設定しなくてはならないので少しめんどいですが、一番使いやすく、汎用性があります。
❶通常のポータルの作り方
右図はポータルを作るときのノード構成の例です。
PositionにはGeometryノードのPosition(ポータル平面の位置)と、映したい空間(Portal Exit Location)までのオフセットをつなぎます。
DirectionにはGeometryノードの視線ベクトル(Incoming反転)を入力します。
回転に適応する
ポータル面や視線ベクトルに回転を加えたい場合は、両者に同じ回転を適用する必要があります。
もし片方だけに回転を加えると、ポータルの表示が引き延ばされたり歪んで見えることがあります。
そのため、Position(位置)と Direction(視線方向)の両方に対してVector Rotateノードを用いて、同じ回転補正を行う必要があります。

Emptyなどでポータルの出口位置・回転(Portal Exit Location/Rotation)を決めてその値をドライバーで設定すれば、ポータルで映し出す画面を簡単に制御できます。


上図:右に恐竜がいる空間があり、左の砂漠空間にポータルを設置しました。ポータルから恐竜のいる空間を映し出したのが右図になります。

これはポータル平面追従型ではありません
この形式のポータルは持ち運びは自由ですが、Emptyの回転・移動によって映し出す空間を制御しているので、ポータル平面を回転するのに空間がついてくるわけではありません。上の例で出したような、大きい空間を映し出し、角度などを調整したい場合に適したポータルだと思います。
合わせ鏡の効果
ポータル生成とは関係ない話題ですが、
ポータルの映る空間にポータル自身を置くと、合わせ鏡のように無限に空間が映り込みます。
面白いと思ったので紹介してみました。

❷Tangent Space(接空間)を利用したポータル
今度はポータルとなる平面のTangent Space(接空間)を利用する方法を解説します。この画期的な手法を紹介しているのが右の動画になります。
空間変換の計算を扱っているためかなり難しいので図解してわかりやすく解説しようと思います。
Tangent Spaceを使うことで、ポータル平面を回転させても視線が平面の方向に追従する自然なポータルが作れます。

Tangent Space(接空間)とは?
まず、Tangent Space(接空間)とは、「ポリゴンの面にくっついたローカル座標系」のことです。
つまり、面の上に小さなXYZ軸が立っているようなものです。
これは、ポリゴン1枚1枚に対して違う向きを持ち、モデル全体を通して「移動する空間」になります。
Tangent Space の3つの軸
Tangent SpaceはXYZの三軸でできていますが、そのオブジェクトのUVの方向を元にして方向が決められています。
接空間は以下の3つのベクトルでできています:

| 軸 | 名前 | 方向 |
|---|---|---|
| X軸 | Tangent(接ベクトル) | UVのU方向(横方向) |
| Y軸 | Bitangent(双接ベクトル) | UVのV方向(縦方向) |
| Z軸 | Normal(法線) | 面の垂直方向(外向き) |
接空間ベースのRay Portalでは、「UVの流れ=空間の基準軸」として使われます。
そのため、ポータル面には、U・V方向が統一されたUVマップを使うことが非常に重要です。
UVが歪んでいたり、島の向きがバラバラだったりすると、ポータル効果が不安定になり、空間がねじれる原因になります。

Tangent Spaceを使うノードの組み方
ノードの組み方としては右図のようになります。(※自分が発案したものではなく、Default Cubeチャンネルのチュートリアル動画で解説されていたものです。)
ポータル平面のUVMapを使い、視線ベクトル(Direction)を接空間に変換しています。
接空間に変換するため、具体的には視線ベクトルと接空間のX軸、Y軸、Z軸との内積を出して面に沿った視線ベクトルを作り直しています。

NormalとUVMap(Tangent(接ベクトル))ベクトルをCross Productで計算することにより、Bitangent(双接ベクトル)を出しています。
※Addノードはオフセットの調節用です。
内積の意味
右図を描いてみました。カメラからの視線ベクトルを、平面の接空間に射影しています。X成分は接空間のX軸(Tangentベクトル)に射影してその成分のみを抽出します。
他のY、Z成分も同様に出して、合成すれば、接空間のベクトルを使ったDirectionベクトルが出来上がります。

※これは線形代数において単に基底変換をしているだけですが、線形代数について詳しく解説したくないので射影という言葉で解説しました。
うまく機能させる条件
Tangent Spaceを使うポータルですが、理由はよくわかりませんが、Z軸の角度が変わるような回転でうまく機能しなくなってしまいます。
自分がやってみた感覚でいうと、特にY軸の回転がどうしてもうまくいきません。

なのでX軸回転をする場合にはVector RotateノードをDirection入力ソケット前に挟み、Invertにチェックをしてポータル平面のX軸回転を補正します。(ポータル平面のX軸回転をドライバーでコピーします)

これでX軸回転をしても機能するようになります。※Y軸回転をするとおかしくなるので、XとZ軸回転を使います。
X軸だけちゃんと補正して、あとはY軸回転を使わないようにすれば右図のような三方向への回転を使ったポータルボックスを作ることもできました。
ドライバ設定って面倒くさくてあまり使いたくないので、X軸回転だけ設定すればいいところが使いやすさのポイントだと思います。


ボックスを作ってその空間を映し出すという手法は右の動画を参考にさせていただきました。
❸ドライバーを利用するポータル
ドライバーで回転情報をそのまま補正するポータルです。
❶のノードとほぼ同じですが、回転はEmptyで制御するのではなく、ポータル平面の回転をInvertで逆にいれて補正しています。
XYZ軸全ての回転をドライバーでコピーしなくてはならないので面倒くさいですが、わかりやすくて汎用性があります。

6面にポータル平面を貼ってカメラを動かしたもの。
ポータル平面複数を動かすアニメーションの方法も簡単なものがあったらいいんですが、すぐには思いつかなかったのでカメラ側を動かしました。

