1

一連のライト シェーダとサーフェス シェーダを 3Delight から PRMan に変換する作業を行っていますが、解決できない 2 つの違いを発見しました。サーフェス シェーダがライト シェーダのトレースによる透過不透明度について評価されている場合、IPRMan の入射ベクトルがサーフェスの法線に設定されているようです。

サンプル シーンでは、円盤の上に半球が浮かんでいます。上から遠く離れたライトが、トレースされた透過値をその背後のサーフェスに投影しています (ライトの場合は少し後方ですが、これはデモです)。半球の表面は、カメラで見ると法線で色付けされたソリッドとしてレンダリングされますが、送信を照会すると入射方向の不透明度になります。

これは私が期待するものであり、3Delight から受け取ったものです:

3ディライトレンダー

床はほぼ純粋な緑色であることに注意してください。入射角が垂直の場合に予想される色。ただし、PRMan でまったく同じシーンをレンダリングすると、次のようになります。

ここに画像の説明を入力

法線を投影しているように見えます。

newを介して値をフェッチしrayinfoて計算しようとしましたが、それらの値はすべて実際に設定されてIいるものと一致します。Iとの不一致にも気付きEましたが、PRMan で設定されているものを突き止めることができませんでした。

Q: 期待しているインシデント ベクトル I を取得するにはどうすればよいですか?

の内容scene.rib:

Display "falloff.tiff" "framebuffer" "rgba"
Projection "perspective" "fov" [17]
Format 400 400 1
ShadingRate 0.25
PixelSamples 3 3

# Move the camera
Translate 0 -0.65 10
Rotate 30 -1 0 0

Option "searchpath" "string shader" ".:&"

WorldBegin

    LightSource "projector" "projector_light"
        "point to" [0 -1 0]

    Surface "matte"
    TransformBegin
        Rotate 90 1 0 0
        Disk 0 1.25 360
    TransformEnd

    Surface "inspect_incident"
    Attribute "visibility" "integer transmission" [1]
    Attribute "shade" "string transmissionhitmode" "shader"
    TransformBegin
        Translate 0 1 0
        Rotate -90 1 0 0 
        Sphere 1 0 1 360
    TransformEnd

WorldEnd

の内容projector.sl:

light projector(

    float intensity = 1;
    color lightcolor = 1;

    point from = point "shader" (0,0,0);
    point to = point "shader" (0,0,1);
    float maxdist = 1e12;

) {

    uniform vector dir = normalize(to - from);
    solar(dir, 0.0) {
        Cl = intensity * lightcolor * (1 - transmission(Ps, Ps - dir * maxdist));
    }

}

の内容inspect_incident.sl:

class inspect_incident() {

    public void opacity(output color Oi) {
        vector In = normalize(I);
        Oi = color((In + 1) / 2);
    }

    public void surface(output color Ci, Oi) {
        vector Nn = normalize(N);
        Ci = color((Nn + 1) / 2);
        Oi = 1;
    }

}
4

1 に答える 1

0

__computesOpacityサーフェス シェーダーの特別なパラメーターのドキュメントを引用します。

値 0 は、シェーダが不透明度を計算しないことを意味します (つまり、Oi == Os)。これは、シェーダーの送信ヒット モードをオーバーライドするために使用できます。このようなシェーダーでは、透過レイの opacity() メソッドはスキップされます。

1 の値は、シェーダーが実際に不透明度を計算することを意味します。このようなシェーダーは、透過光線の不透明度を評価するために実行されます。その結果はレンダラーによってキャッシュされる可能性があるため、ビューに依存しない必要があります。

値 2 は、シェーダーがビューに依存する方法で不透明度を計算することを意味します。そのため、レンダラーは透過光線の不透明度をキャッシュすることを回避します。不透明度は、拡散光線と反射光線の継続を制御する目的で引き続きキャッシュされますが、ビューに依存する影は、areashadow() または Transmission() を使用して生成できます。モード 2 の場合、 opacity() メソッドは、raytype == "transmission" のチェック内のビュー依存エンティティのみに依存する必要があります。

そして、ピクサーのブライアンの言葉を引用します:

2あなたが望むことをするためにそれを設定してください。あなたが見ているのは、レンダリングが opacityドームで一度実行されI、それがキャッシュされていることです。

于 2012-05-15T17:43:05.557 に答える