Graphics RenderMan事件向量不一致

Graphics RenderMan事件向量不一致,graphics,3d,render,renderman,Graphics,3d,Render,Renderman,我正在将一系列灯光和曲面着色器从3Delight转换为PRMan,我发现两者之间有一个我无法理解的差异。当由于灯光着色器中的轨迹而评估曲面着色器的透射不透明度时,PRMan中的入射向量I似乎被设置为曲面的法线 在我的示例场景中,有一个半球漂浮在光盘上方。从上面射出的一束远光将追踪的透射值投射到它们后面的表面上(光线稍微向后,但这是一个演示)。半球上的曲面在通过摄影机查看时渲染为由其法线着色的实体,但在查询传输时具有入射方向的不透明度 这就是我期望它的样子,也是我从3Delight得到的: 请注

我正在将一系列灯光和曲面着色器从3Delight转换为PRMan,我发现两者之间有一个我无法理解的差异。当由于灯光着色器中的轨迹而评估曲面着色器的透射不透明度时,PRMan中的入射向量
I
似乎被设置为曲面的法线

在我的示例场景中,有一个半球漂浮在光盘上方。从上面射出的一束远光将追踪的透射值投射到它们后面的表面上(光线稍微向后,但这是一个演示)。半球上的曲面在通过摄影机查看时渲染为由其法线着色的实体,但在查询传输时具有入射方向的不透明度

这就是我期望它的样子,也是我从3Delight得到的:

请注意,地板是实心的,几乎是纯绿色的;如果入射角是垂直的,我们期望的颜色。但是,当我使用PRMan渲染完全相同的场景时,我收到的是:

它似乎正在投影法线

我尝试通过
rayinfo
获取值并计算新的
I
,但这些值都与
I
实际设置的值相匹配。我也注意到了与
E
的差异,但我无法确定它在PRMan中的设置

Q:如何获得我期望的事件向量'I?

场景.肋骨的内容

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
投影仪.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));
    }

}
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;
    }

}
检查事件的内容。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));
    }

}
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;
    }

}

引用曲面着色器的特殊
\u computesOpacity
参数的文档:

值为0表示着色器不计算不透明度(即Oi==Os)。这可用于覆盖 着色器的传输命中模式。对于此类着色器,不透明度() 将跳过透射光线的方法

值为1表示着色器确实计算不透明度。这样的 将运行着色器以评估其透射光线的不透明度。 渲染器可能会缓存该结果,因此必须 视图独立

值为2表示着色器根据视图计算不透明度 态度。因此,渲染器将避免缓存不透明度 透射光线。不透明度仍然缓存用于 控制漫反射和镜面反射光线上的连续性,但 依赖于视图的阴影可以使用areashadow()或 变速箱()。对于模式2,opacity()方法只能依赖于 查看光线类型==“传输”检查中的相关实体

引用皮克斯的布莱恩的话:

将其设置为
2
以执行所需操作。您看到的是渲染运行
opacity
一次,使用圆顶'
I
,并将其缓存