2D和3D图形引擎的混合

 

在图形技术的应用中,既没有什么限制,也没有什么必须遵守的规则。也就是说,没有限制使用二维图形或三维图形,完全可以将它们两者无损地混合在一起。

 

在三维中绘制二维贴片

需要一个代表游戏层次的三维网格模型,如下图所示:

一个角色在三维世界里四处移动(通常是沿着一个轴线移动),当角色移动时,摄像机也跟着移动。摄像机需要停留在一个比角色较高的平移位置上,这样就会产生出全三维的层次效果。不需要别的额外操作,只要加载一个代表层次的网格模型,创建一组代表了物体(例如玩家角色)的二维贴片,并将每件东西正确地排列绘制到每帧中即可。

在游戏如最终幻想和寄生前夜(两者都是由Square公司出品)中,可以在欣赏三维模型的同时,享受到非常精美的预先渲染好的背景图像。将二维和三维图形混合在一起,一直以来都是游戏公司高度保密的技术,现在可以揭开谜底一看究竟。

如何从一个二维图像中获取三维的深度信息呢?有几种方法可以实现三维物体在二维图像中的背景幕效果。

(1)在一个三维建模工具中创建预先进行渲染的背景幕,例如Caligari公司的gamespace lightdiscreet公司的3D Studio Max,并将图像与包含每个像素z值的深度缓冲区一起保存。对于游戏中的每一帧,将图像的深度缓冲区拷贝到背景深度缓冲区中,并继续绘制三维物体。

(2)在层次中创建背景幕,从底层开始,一个接一个地绘制每个图像,并将三维角色绘制到适当的层次上,这样就可以使用后面的层次覆盖较低层次的部分内容(以及三维物体)。

(3)使用一个非常详尽的预先渲染好的背景幕,以及一个在三维建模软件中渲染场景的简化的网格模型。使用网格模型以呈现z数值并进行碰撞检测,三维物体可以使用z缓冲区负责绘制正确的深度。

我们采用第三种方法来绘制。

 

二维背景幕的处理

用一个三维建模软件开发二维的背景幕,例如gamespace light(而不是使用一个绘图程序,因为需要从建模软件中获取多边形的数据),下图显示了一个简单的网格模型以及最终的渲染效果:

一旦场景被渲染好,就需要将它作为一个位图保存到磁盘上,那个位图文件需要被切分成较小的纹理,如下图所示,这个背景幕被切割成多个Direct3D可以处理的纹理,比如背景幕图像为640 x 480,所以纹理将为256 x 256(对于块1245),以及128 x 256(对于块36)。

 

场景网格模型的处理

详尽的层次看起来非常不错,现在想要包含一些三维物体到它里面。首先,需要构造一个简化的场景,可使用两种方法,包括填充每一帧的深度缓冲区,以便三维物体能够正确地与二维的背景幕进行混合;作为运动物体的碰撞网格模型。

因为网格模型必须在每帧中被渲染出来,以便创建场景中的z缓存,使用越少的多边形当然越好,然而必须使用足够的多边形以确保三维物体能够被正确地混合,如下图所示,它显示了最终渲染好的图像,实际的场景网格模型,以及简化的场景网格模型。

当处理一个简化的网格模型时,仅使用了两种材质(没有纹理)。第一种材质代表了实际绘制到背景幕上的多边形区域,而第二种材质隐藏了在交集测试中所使用的多边形,对于第二种材质,使用的alpha的数值为0.0(意味着它是不可见的,不会被实际渲染)。

应该使用正确的多边形数量去渲染场景。如果有太多的多边形,引擎将变得非常缓慢。如果多边形太少,将会在玩游戏时得到贴图错误的信息。请这样思考一下:一个使用了500个多边形的球形网格模型,很明显比一个简化的网格模型复杂许多,在一个简化的网格模型里,仅需要足够的多边形去表示球体,并确保它在进行渲染时覆盖相同的屏幕区域。

下图演示了在创建简化网格模型时常出现的一个错误,那就是使用了太少的多边形。

为了简化网格模型中多边形的数量,切割掉那些看不到的表面或者在交集测试中所使用的表面,同时仅绘制那些实际覆盖三维物体的多边形。举个例子,如果在背景幕中有一个盒子,而玩家角色从不会接近它,那么在简化的网格模型中就不用绘制它。

对于本例中的背景幕,仅需要绘制如下的简化网格模型:

 

场景的渲染

现在将完成最后一步,以确保背景幕图像能够包含深度信息(通过简化的网格模型)。如果加载了背景幕图像和简化的网格模型,就可以很容易地渲染游戏中的每帧,通过使用如下步骤:

(1)将z缓冲区清除为1.0(并确保z缓冲区被启动)。

(2)渲染简化的网格模型(因而填充场景的z缓冲区),跳过那些数值为0.0的多边形(它们是不可见的)。

(3)禁用z缓冲区。

(4)使用ID3DXSprite位块传送背景幕纹理。

(5)启动z缓冲区。


绝大多数新近的显卡都允许处理
1024 x 1024像素大小的纹理,这意味着可以将整个背景幕图像加载到内存中,而不需要将它切割成6个小纹理。

在绘制好背景幕后,剩下的就是将三维物体(网格模型)绘制到场景中,因为Z缓冲区包含了所有与每个像素相关的深度数值。请不要犹豫,随心所欲绘制角色、物体、甚至是增强背景的图像。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值