游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4973|回复: 13

关于3D流水线

[复制链接]

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
发表于 2006-2-17 10:07:00 | 显示全部楼层 |阅读模式
寒假深入研究了一下,还从朋友处拿了本《3D游戏编程大师技巧》
学过之后理论扎实了,但对D3D的流水线却模糊了
一:
我用D3D,把许多物体(mesh)放在相机背后,按理说应该被引擎裁剪掉,
但是帧数事不会骗人的,画的越多,速度越慢,难道D3D没有执行多边形裁剪???
二:
需要对多边形显示进行排序,以达到从后向前正确绘制的目的,但画家算法和
z缓冲不是能解决么,是不是由于他们性能不好所以还需BSP,此二不解。

望高手解答,谢谢

30

主题

569

帖子

569

积分

高级会员

Rank: 4

积分
569
发表于 2006-2-17 11:45:00 | 显示全部楼层

Re:关于3D流水线

    D3D的裁剪是在进行变换以后,而且如果在视野内的话,他是要进行绘制的,然后再绘制前面的东西。
    顶点多的话进行3D变换是耗时的大户,投影到屏幕的面积越大(含被遮挡的面),需要绘制的像素越多,所以也就越耗时。这都是基本的性能瓶颈。
    BSP可以在渲染前帮你快速挑出来可以看到的面,不看到的面不用变换和光跚化,所以快。

35

主题

161

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2006-2-17 12:33:00 | 显示全部楼层

Re:关于3D流水线

我不是高手,第一个问题谈一点自己的理解:
我想D3D是没有自动视锥裁剪的,即使顶点都在相机背面,但DrawPrimitive还是会被执行的。所以我们一般都要自己进行ViewFrustum裁剪。

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
 楼主| 发表于 2006-2-17 16:01:00 | 显示全部楼层

关于3D流水线

如果要自己裁剪,那不是很麻烦?
裁剪可以在很多地方执行,世界坐标,相机坐标,透视投影空间都行
但在世界坐标裁剪有时候没必要,这是剔除物体更有效
然而变换为相机坐标后由于视景体面平行使裁剪容易
有些模型被减掉一部分,而裁剪会产生大量新生成的定点,还要计算他们的纹理坐标,法线等等
想来想去只有在执行相机变换后再裁剪好些,头晕了

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-2-17 17:21:00 | 显示全部楼层

Re:关于3D流水线

BSP并不会裁减掉任何多边形,在zbuffer广泛使用之前,BSP是很好的保障多边形深度正确的算法,目前阶段也是为了裁减使用,但BSP本身并不会做任何裁减,只是其他裁减算法会用用到BSP,比如portal。

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
 楼主| 发表于 2006-2-17 18:31:00 | 显示全部楼层

Re: 关于3D流水线

z缓冲确实不错,保证了多边形渲染正确
现在对相机坐标空间的裁剪问题很大

35

主题

161

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2006-2-17 18:51:00 | 显示全部楼层

Re:关于3D流水线

相机坐标空间的裁剪就是ViewFrustum剪裁。
基本原理是判断一个点是否在View Frustum的内部,也就是判断点和frustum6个面的位置关系。Mesh可使用包围球判断。
具体可参考RolePlayingGamewithDirectX里的相关内容。

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
 楼主| 发表于 2006-2-17 19:58:00 | 显示全部楼层

Re: 关于3D流水线

物体剔除可以使用包围体在相机变换检测,这我知道
问题是部分裁剪怎么办,涉及到顶点删除和新插顶点

0

主题

6

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-2-17 20:05:00 | 显示全部楼层

Re:关于3D流水线

一、D3D执行的是图元的剪裁,也就是对三角形剪裁,它处于流水线比较低的层次。而引擎的剪裁是物体级别的剪裁,处于流水线最高的层次。层次越高,一次剪裁所抛弃的三角形也就越多,系统的负荷也就越小。一次物体的剪裁可以抛掉上千上万的三角形,而一次图元的剪裁只会抛掉一个三角形。在D3D执行图元剪裁前,数据还要从系统内存传送到显存中,再经过固定管线或者VS的变换,才能决定一个三角形是否需要被剪裁掉,而引擎级别的剪裁可以大量减少这样的操作,速度自然快很多。
二、排序的目的不仅仅是为了正确渲染物体,它还能提高渲染速度。在打开Z Buffer的情况下,从前向后渲染不透明的物体可以使GPU不去处理那些被遮蔽的像素。如果这些像素面积很大,而本身又有很复杂的PS程序,这种优化就可以明显的提高帧速。实际上对于不透明的物体,排序不是必需的,因为这时候Z Buffer可以很正确的工作,只是速度略满些。而对于半透明的物体,排序就是必需的了,只有从后到前渲染才能产生正确的结果。(对于某些渲染状态,不排序也能产生正确的结果)。
      Z Buffer的性能是非常好的,但也不能因此就随意使用。因为整个3D流水线中没有免费的步骤,任何操作都要付出代价的。而且经过的流水线级数越多,这种代价也就越昂贵。不管是VFC还是BSP,都是为了在流水线尽可能高的级别上过滤到那些不需要处理的数据。因此它们都是必要且必需的技术。

22

主题

92

帖子

94

积分

注册会员

Rank: 2

积分
94
QQ
 楼主| 发表于 2006-2-17 20:31:00 | 显示全部楼层

Re: 关于3D流水线

happyfire的想法和我差不多

Magicren:
你说D3D执行的是图元的剪裁,也就是对三角形剪裁。
那为什么在相机后画了多个mesh速度会慢
难道速度是慢在D3D这个裁剪过程中么?

打开zbuffer确实对系统是个较大的负担
我现在机子主频1000MHz,如果使用1024×768全屏
如果写一次内存需要4个时钟周期,那我估算清空一次zbuffer要6.29毫秒


这样的话如果要维持FPS60,也就是每秒有377.48秒用在清空zbuffer上,真是耗资源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 11:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表