Houdini 中文帮助文档

深度相机贴图

Overview

深度相机贴图是一种渲染出的图像,在相机和几乎不透明的曲面直接的半透明区域(如体积对象区域)存储着深度信息。图像中的每个像素都是用曲线来描述透明度值如何根据场景深度来变化。此可以让你合成渲染的图像,并根据对象深度正确的混合半透明区域。

深度相机贴图可以用于有高透明度的物体,如群集的精灵,云等。你应当将每个这样的物体渲染为独立的DCM。DCM可以让你将和其接触的物体分开渲染,允许在合成中有更多的灵活性。

深度相机贴图的主要缺点是会花费很大的磁盘空间,给定数量的信息会存储在每个像素上。一个2K的DCM帧可能会花费1到2G的磁盘空间,最少的空间预算应当是1TB(就是最少要用1TB的空间)。其它缺点是当它们被添加到合成中时,DCM中的物体不会接受阴影。

Houdini只支持在rat格式的文件中存储DCMs。该图像可以包含深度相机贴图(每像素深度信息)和深度栅格(额外的颜色面)。

How to

要渲染一个深度相机贴图,你必须添加两个渲染属性到相机上,或 render driver (渲染驱动)节点上。

To… Do this
Set up a camera or render output node to render as a DCM

设置一个相机或渲染输出节点,来以DCM方式渲染

1. 选择相机或渲染驱动节点。

2. 在参数编辑器中,点击gear菜单,选择编辑渲染参数。

3. 在左侧的三个子条板中,打开mantra文件夹,然后是输出文件夹。

4. 选择“DCM文件名”和“Deep Resolver”属性,点击该按钮将它们移动到旁边的已有参数中。此会添加属性到节点的参数界面上。

5. 点击接受按钮。

6. 在节点的参数编辑器中,点击输出选项卡。(在渲染驱动节点上,输出选项卡是属性选项卡的子选项卡)

7. 设置深度重解算参数为深度阴影重解算方式。设置DSM文件名参数为你想要将其保存到的RAT文件名,如$HIP/textures/$OS_$F_dcm.rat。

($HIP是包含当前文件的目录,$OS是当前节点名。$F是帧标号)。

当你渲染时,mantra会输出DCM到所输出的图像上。

子自定义精度和文件尺寸之间的权衡 有几个属性可以允许你降低深度合成的精度,以便减少DCM文件的尺寸。如果DCM中的物体没有细节,或在远近剪切面之间的距离太小,深度合成精度就不会那么重要了,且这些属性也是非常有用的。

添加DCM压缩属性,并增加它可以去掉一些采样。

添加DCM Z Storage属性,并将其从32位浮点改为16位浮点格式。此会用比特数量代表采样的深度。

如果这里设置的太低,你会看到阶梯式的步幅,以及动画中暂时的混乱分散。

添加 DCM Z-bias属性,并且增加它。在该值范围内的采样点会被相互合并。

Optimize DCM generation for volumes

优化用体积的DCM生成方式

如果你给体积对象使用深度相机贴图,可以添加DCM插值属性,并将其设置为“连续体积方式”。

对于其他几何体(实体曲面,透明曲面,精灵等),你应当使这些属性保持为默认的“离散曲面”方式。

Composite two rendered DCMs together

将两个渲染好的DCm合成

DSM Merge render 节点或 dsmmerge command line utility工具。
Convert a DCM file into a flat image

将一个DCM文件转为图像文件

使用 DSM Flatten compositing 节点。

的使用建议

使用材质的不透明度预乘漫反射元素。

每个物体都需要其自身的DCM信息。

在DCM文件名中使用$OS(当前节点名)可以将(不同物体的)DCMs分离开。

在合成节点中合并深度相机贴图显然不会给你本身的效果。

 

在材质中使用深度贴图

在VOPs中,查看Shadow Map VOP节点。

在VEX中,查看textimport,shadowmap,dsmpixel部分,例如:

cvex

dsminfo(string map=”foo.rat”)

{

string   names[], name;

float   Pz[];

vector   Of[];

vector   res;

int      x, y;

 

if (teximport(map, “texture:resolution”, res))

printf(“%s resolution: %g\n”, map, res);

teximport(map, “texture:channelnames”, names);

printf(“%d channels:\n”, arraylength(names));

foreach (name; names)

printf(“\t’%s’\n”, name);

 

x = res[0] * .5;

y = res[1] * .5;

if (dsmpixel(map, “Pz”, x, y, Pz) &&

dsmpixel(map, “Of”, x, y, Of))

{

int      i, n;

n = arraylength(Pz);

printf(“Depth complexity[%d,%d] = %d\n”, x, y, n);

for (i = 0; i < n; i++)

printf(“\tZ=%g, Of=%g\n”, Pz[i], Of[i]);

}

}

点击分享到: