一連のライト シェーダとサーフェス シェーダを 3Delight から PRMan に変換する作業を行っていますが、解決できない 2 つの違いを発見しました。サーフェス シェーダがライト シェーダのトレースによる透過不透明度について評価されている場合、I
PRMan の入射ベクトルがサーフェスの法線に設定されているようです。
サンプル シーンでは、円盤の上に半球が浮かんでいます。上から遠く離れたライトが、トレースされた透過値をその背後のサーフェスに投影しています (ライトの場合は少し後方ですが、これはデモです)。半球の表面は、カメラで見ると法線で色付けされたソリッドとしてレンダリングされますが、送信を照会すると入射方向の不透明度になります。
これは私が期待するものであり、3Delight から受け取ったものです:
床はほぼ純粋な緑色であることに注意してください。入射角が垂直の場合に予想される色。ただし、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;
}
}