创建基于实体节点的BSP编译器和渲染器 (第一节 概要和第一棵BSPTree)

简介

二分法刨分场景技术已经存世很多年了.让Bsp Tree变成是一个时髦词汇的是约翰卡马克(id software的大神 详见Doom启示录一书)在Doom和Quake的使用.虽然游戏Doom已经很老了.但是Bsptree在所有的第一人称射击类型的游戏中仍然是重中之重,也通过了时间的考研.这个教程是要去解释如何开发一个 基于实体节点的Bsp编辑器和渲染器(编译器就是说bsp需要离线处理出数据放到内存或者硬盘上的.然后渲染器就是说加载生成的数据然后渲染出来显示到屏幕上).没有经验的程序员.害怕3d绘图的.希望看完了我的解释能明白这一算法的精妙.
理解Bsp是必要知道一些数学知识的.例如:叉积,点积能干啥..有相关产品开发经验的话可以继续读.如果没有可以去看相关的Dot和Cross(叉积点积)的数学教程.

什么是BSPTree

再开发3d引擎的期间你需要解决首要的问题是:在当前的摄像机位置使用正确的渲染顺序去渲染所有的将要渲染的几何体的每一帧.你可能会说.别忘了我可以使用ZBuffer来解决顺序问题.你当然可以使用ZBuffer但是是在没有透明物体的情况下.如果有半透明物体.那么你将无法正确的渲染使他正确的显示出来.(ZBuffer是一个深度缓冲相关的技术.OpenGL中是一个标志.如果打开.渲染的时候就会根据渲染点的z值来决定那个点最后显示出来.从而呈现出遮挡的关系.如果是模型中有半透明的部分那么就必须要排序之后进行混合.关键问题就出在blender的顺序上.不透明的必定要先渲染.透明的必定要后渲染)通过camera到每一个多边形的正确顺序来处理每一帧渲染循环都去解决排序和层次问题.

深度排序问题

上面的图片的渲染情况会出一个问题.当你尝试去从后往前画这两个多边形的时候(画家算法).两个多边形会不能正确的被画出来.先画红的后画绿的绿色的会把红色的覆盖掉…通过Zbuffer是可以解决这种问题的.但是效率不太好.如果没有硬件加速是非常废系统资源的,但是Zbuffer也不是全能的,它并不能解决半透明问题.通过BspTree技术可以轻松的解决上述的所有问题,不单如此.还可以处理其他领域的问题(碰撞检测(因为通过BSP渲染技术之后,一帧要渲染哪些多边形是知道的所以计算诸如FPS类型的游戏打枪到墙壁的时候碰撞检测会很简单遍历当前的多边形进行计算就可以了), 多边形剔除算法)
创建一个BspTree是一个离线的过程.你可以在游戏一开始就把bsptree预计算出来.然后游戏里面使用.所有的多边形排序都是预处理出来的.这是Bsp编辑器的工作.传入一个所有的多边形的列表来然后预先排序他们.处理出来的数据可以存到硬盘上.然后游戏运行的时候可以加载进来在游戏循环环境下快速的遍历.
不但BspTree可以用来正确的渲染所有多边形在场景里.而且可以超快速的来剔除当前视点看不见的多边形.
这是因为可以简单的测试多边形在实景,这样所有的后面被遮挡的多边形就会在你的游戏中被剔除掉..我如法给你形容bsptree引擎的每一帧有多快.他可以简单的就剔除掉成千上万的多边形.我们还将使用bsptree快速的进行碰撞检测.现在通过这个文章的概念来解决排序问题,怎么样以对的顺序渲染多边形在我们的场景里.我们将开发BSP的编译器来看看这个技术是如何工作的.

如何工作的?

看下下面的例图A.他显示了一个从上面看的简单的游戏层级.这些黑色的线就游戏视图里看到的墙.那些黑色的箭头描述了墙的面向的方向.可以理解成2d线的法线.

上面的Ca Cb Cc是三个实例.它表明游戏里的3个位置(相机的位置).通过摄像机的位置先渲染最远的墙.然后渲染最近的墙.我们应该取以下的顺序.

Camera Position

Correct Drawing Order

Ca

D or E in any order, A , C & B is Unclear

Cb

D or E in any order, A , B & C is Unclear

Cc

C & B is Unclear , A , D or E in any order



BspTree存储这所有多边形的层级关系,里面都是后面前面或者相邻的多边形,但是有一个问题就是C和B墙.我们不能明确的描述C在B的前面还是后面.这个问题使我们无法在所有的位置来使用正确顺序来渲染.
因为我们不能描述墙C是在B的前还是后.BSPTree算法将写不出来.我们必须解决这个问题让BspTree能识别这个”前后”处理.这就是二分法…(我们延长B, C会被切割成两个我们叫C1 C2. 之后C1就是B的前 C2就是B的后.BSPTree就适应了)..后面细说.这块还有点抽象.
BSPTree存储多边形的的信息是把世界切成两半.所有的多边形检测哪个在多边形的哪边.如果相交就切开.成多个之后进行记录.也就说原来的多边形被切成了新的两个多边形.

所以我们的第一次分割完成了.我们拥有了两个新的多边形..相当于第一分割出了两个世界.这两个世界里只有绝对的前面的多边形和绝对的后面的多边形.不会再有模糊的概念.之后这两个世界里的多边形选取一个继续分割.最后当没有可以分割的就结束该过程了.(如何选取分割的面也是一门科学.)

Front List of split (A)

 

Back List of Split (A)

B , C

 

D , E

Front List of split (B)

 

Back List of Split (B)

Ca

 

Cb

Front List of split (D)

 

Back List of Split (D)

E

 

Nothing


第一次通过A来刨分生成两个空间.后面有 DE 前面有BC..先说前面的B之后继续刨分A前面的世界.然后把C切分成了Ca Cb.Ca就在B的前世界.Cb就在B的后世界.Ca再分已经没东西了截止.Cb再分也没东西了截止.再看A的后面的世界.有D和E.我们选D来刨分.之后D的后面没有东西.D的前面有E.之后E再分已经没有东西了.结束此过程. BSP创建成功

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值