首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderMan事件向量不一致

RenderMan事件向量不一致
EN

Stack Overflow用户
提问于 2012-05-14 16:07:14
回答 1查看 264关注 0票数 1

我正在努力翻译一系列的光和表面着色器从3乐趣到PRMan,我已经发现两者之间的差异,我无法解决。当表面着色器由于光线着色器中的痕迹而被评估其传输不透明度时,PRMan中的入射矢量PRMan似乎被设置为表面的法线。

在我的例子场景中,有一个半球漂浮在光盘上方。远处的光线从上面投射到它们后面的表面上(对于光来说有点向后一点,但这是一个演示)。半球上的表面被摄像机观察到的法线呈现为实色,但当被询问以进行传输时,表面呈现出入射方向的不透明度。

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

注意,地板是实心的,几乎是纯绿色的;如果入射角是垂直的,我们所期望的颜色。然而,当我用PRMan呈现完全相同的场景时,我会收到这样的结果:

它似乎是在突出法线。

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

问:我怎样才能得到我期待的事件向量?

scene.rib含量

代码语言:javascript
复制
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含量

代码语言:javascript
复制
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含量

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 17:43:05

引用关于表面着色器的特殊__computesOpacity参数的文档:

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

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

值2表示着色器以视图依赖的方式计算不透明度.因此,渲染器将避免缓存传输射线的不透明度。这种不透明度仍然是为了控制漫射和镜面射线的连续性而缓存的,但是可以使用面影()或透射()来生成与视图相关的阴影。对于模式2,不透明度()方法必须仅依赖于对raytype ==“传输”的检查中依赖于视图的实体。

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

将其设置为2来做您想做的事情。您所看到的是,呈现只使用圆顶的I运行一次I,并缓存.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10587040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档