高级主题

手动传递光照贴图

光照贴图在摄影机空间中渲染,使用相邻像素存储前后表面灯光数据。由于它们水平相邻,因此这意味着光照贴图的宽度应大于其高度。如果需要前表面和后表面的 500x500 实际采样,光照贴图应该是 1000x500 像素。

光照贴图必须是 32 位纹理。浮点 RGBA 完全是必需的,因为 Z 深度信息存储在 Alpha 组件中。可以使用 .exr 格式来节约内存,性能几乎不受影响,且节省了 50% 的内存。

将显示 depthmap 不能由用户指定,且仅用于自动模式。它的唯一作用是能够小幅度地优化内存/性能。

自动光照贴图生成

为便于使用,以正确的格式传递显式光照贴图不是必需的。但是,由于所有参与着色器必须了解使用的光照贴图,因此可以使用一种特殊类型的现象,其中现象的前两个参数必须是 lightmap 和 depthmap 对。无论各个着色器在现象中的哪个位置使用,它们都必须通过 interface 连接链接到这前两个参数,而不是设定为特定值。

只有满足这些条件,才能使用自动光照贴图创建。如果不满足上述条件,必须使用光照贴图手动指定。

以下是满足这些条件的现象的伪代码:

declare phenomenon 
    material "my_sss_phenomenon" (
        color texture     "lightmap",                  # must be first
        color texture     "depthmap",                  # must be second
        color             "diffuse_paint",
        color             "my_special_color",
        scalar            "lightmap_size",             # for example
        ...
    )
    shader "myscattering" "misss_fast_shader" (
        "lightmap"        = interface "lightmap",      # required
        "depthmap"        = interface "depthmap",      # required
        "diffuse_illum"   ...
        ...
    )
    shader "mylightmapping"   "misss_lightmap_write" (
        "lightmap"        = interface "lightmap",      # required
        "depthmap"        = interface "depthmap",      # required
        "lightmap_group"  "A",
        "lightmap_size"   = interface "lightmap_size", # for example
        ...
    )
    ...
end declare

如果未遵循这些准则,可能会导致现象行为无法预测,并且可能会在着色器尝试通过丢失或用于其他目的的参数窗口通信时中止渲染。

网络渲染

mental ray 渲染光照贴图时,它尝试基于每个对象将工作量分配给多台主机。但是,misss_fast_ 着色器鼓励(由于内存效率)并在某些情况下需要(对于要彼此散射的单个对象)多个对象共享同一个光照贴图。

多台主机写入到同一光照贴图在 mental ray 中是不可能的,并将会产生冲突,从而导致创建不完整或错误的光照贴图数据。

以下是解决该问题的一些方法:

请注意,当使用置换时,对象可能会自动分割成多个子对象,这些子对象将单独被细分并生成光照贴图。此操作将导致一个对象成为很多对象,但列出的前两个解决方案将失效。

Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.