翻译:alphachi
一、声明
本文所描述的技巧基于一个非正式的3D Lingo特性。虽然大部分时间人们对此并不关心,但Intel已经宣布在未来的Shockwave版本(Shockwave当前版本为8.5.1)中将会取消这一特性(并会给出更好的解决方案)。因此只将其使用在以放映机发布的项目中会比较安全。
本文涉及了一些Director的3D性能方面的知识。如果你是Director 3D方面的新手,那么先看看下面这些文章。
学习基础3D
学习基础3D(续)
"Star Wars"Crawl: The Texture Generation
[内容] 仅在Z缓冲器中渲染物体。
[优势] 通过使用Z缓冲器渲染能够解决很多问题,本文仅讨论其中的一项应用:创建一幅高质量的背景图像(可以是手绘的,也可以是使用一些高端的3D组件渲染的)并在Z缓冲器中渲染一个简单的场景,使物体能够置于背景的前面和后面,给用户一种背景确实是场景一部分的幻觉,以代替原来看上去只像是一个平面的感觉。

点击上图观看Shockwave版本的样本影片。
二、具体方法
在Z缓冲器中渲染的基本步骤如下:
1. 在Z缓冲器中渲染相应的物体。
2. 将一大型的黑色平面的能见度设置为#front_nodepth,并使其覆盖整个屏幕。
3. 渲染“普通”的物体。
关键在于第二步,使用特殊的(无支持的)#front_nodepth标记,就能够通过控制一块大型的黑色平面来“清除”屏幕,同时又使Z缓冲器中的内容保持不变。本例中我们以绘制背景代替了清除屏幕。
三、随之而来的一些问题
按照出现在全局群组的子列表中的先后顺序,Shockwave 3D Xtra渲染缺省的所有子代。控制渲染规则的方法在于优先创建群组,下面的语句在名为W3D的Shockwave 3D演员中创建了一个新的空群组:
pW3D.newGroup ("renderPass1")
pW3D.newGroup ("renderPass2")
pW3D.newGroup ("renderPass3")
当你使用新的群组时,它们将按照创建的顺序被自动添加到全局群组的子列表中,因此为了优先绘制,可以将其parent property设置为group ("renderPass1");对于需要稍后绘制的,可以使用一个group ("renderPass2")的子代,依此类推。
因此,在某一静态背景下,如果想让物体在一些背景元素的前面和后面移动,那么就应该把全部Z缓冲器中的粗糙模型都置于group ("renderPass1")中, 将背景图像(其本身为一个平面模型)置于group ("renderPass2")中,将场景中需要操纵的物体置于group ("renderPass3")中。
附带的资源文件包括实例中的的全部代码,以及关于发生的事件的注释。如果你没有完全明白整个过程,我强烈建议你在观看代码之前运行电影,并打开3DPI,同时在演员标签中检查其在全局群组中的层次。
四、对#front_nodepth不被支持的说明
为什么要写一篇关于已被宣称要取消的特性的文章?这主要是由于缺少了#nodepth标记,Intel提供的更好的Z缓冲器控制会有一些问题。即使这种语法形式的特性消失了,在Z缓冲器中渲染的可能性也依然存在,所以本文所述的技巧在将来的Director版本中并非毫无用处。
相关附件