RenderMan でディフューズ間接光(1バウンス)を計算するテスト

概要

  • 今回は RenderMan でディフューズ間接光(1バウンスのみ)をレイトレースでレンダリングするプログラムを手元で動かしてみました.
  • 今回も参考文献のサンプルを参考にして, 3DeLight を使ってレンダリングしただけです.

レンダリング結果

ディフューズ直接光+ディフューズ間接光(1バウンス)のライティング結果


ディフューズ直接光のみのライティング結果

内容

  • まず, カメラから見える表面上の各点に対して, 天井に設置してあるライトからの直接光によるディフューズライティングを計算しています.
  • 次に上記のカメラから見える表面上の各点の法線を中心とした半球状に対してレイを飛ばして, そのレイとヒットした表面の色(直接光によるディフューズライティング)を間接光として利用しています.
  • この例ではディフューズ間接光のバウンス回数が 1 回ですので, 上の処理をさらに再帰的に行うようなことはしないです.

3DeLight での実行手順

  // シェーダのコンパイル
  $ C:\Program Files\3Delight\bin\shaderdl.exe indirect.sl  
  $ C:\Program Files\3Delight\bin\shaderdl.exe cosinelight_rts.sl

  // rib を描画
  $ C:\Program Files\3Delight\bin\renderdl.exe test_indirect_trace.rib

コード

// indirect.sl
// ディフューズ直接光とディフューズ間接光のシェーダ
surface indirectsurf2( float Kd = 1, samples = 16; )
{
        // 視点 I を向いている法線 Ns
        normal Ns = faceforward( normalize( N ), I );
        
        // ディフューズ直接光の計算
        color diffuse_direct = diffuse(Ns);

        // ディフューズ間接光の計算
        color diffuse_indirect = indirectdiffuse(P, Ns, samples );
        
        // ディフューズライティングの成分だけを代入
        Ci = Kd * ( diffuse_direct + diffuse_indirect ) * Cs * Os;

        // 不透明度
        Oi = Os;
}
// cosinelight_rts.sl
// これは Web 上から別途入手
##################################################
#
# test_indirect_trace.rib
# レイトレースによるディフューズ間接光の計算
#
##################################################

FrameBegin 1
    # フレームバッファの設定
    Format 400 400 1
    ShadingInterpolation "smooth"
    PixelSamples 4 4

    Display "" "framebuffer" "rgba"

    # ガンマ補正
    Exposure     1.0 2.2

    # カメラの設定
    Projection "perspective" "fov" 30
    Translate 0 0 5

    # シーン
    WorldBegin

        # 天井の小さい光源
        LightSource "cosinelight_rts" 1 "from" [0 1.0001 0] "intensity" 4
        AttributeBegin
            Surface "constant"
            Translate 0 1 0
            Sphere 0.03 -0.03 0.03 360
        AttributeEnd

        # レイトレースで見えるように設定
        Attribute "visibility" "trace" 1

        # ディフューズのバウンス回数は最大 1 回
        Attribute "trace" "maxdiffusedepth" 1

        # 補間なし
        Attribute "irradiance" "maxerror" 0.0

        # コーネルボックスの壁
        AttributeBegin
            Surface "indirectsurf2" "Kd" 0.8 "float samples" 128
            Color [1 0 0]
            Polygon "P" [ -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 ]
            Color [0 0 1]
            Polygon "P" [ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 ]
            Color [1 1 1]
            Polygon "P" [ -1 1 1 1 1 1 1 -1 1 -1 -1 1 ]
            Polygon "P" [ -1 1 -1 1 1 -1 1 1 1 -1 1 1 ]
            Polygon "P" [ -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 ]
        AttributeEnd

        # 影を落とすように設定
        Attribute "visibility" "transmission" "opaque"

        # 左側の球
        AttributeBegin
            Surface "indirectsurf2" "Kd" 0.8 "float samples" 128
            Translate -0.3 -0.7 0.3
            Sphere 0.3 -0.3 0.3 360
        AttributeEnd

        # 右側の球
        AttributeBegin
            Surface "indirectsurf2" "Kd" 0.8 "float samples" 128
            Translate 0.3 -0.7 -0.3
            Sphere 0.3 -0.3 0.3 360
        AttributeEnd
    WorldEnd
FrameEnd

参考文献