空间划分及可见性算法【一】

最简单的流水线可见性处理如下:

对每个物体转换到世界坐标,然后进行视椎体剔除,其次是背面消隐,最总通过空间剪裁和光栅化期间的图像空间裁剪得到最终的要绘制的图像。

在场景很简单,物体很少的情况,上述方法是可行的。但考虑到现代游戏的场景复杂程度,如果还采用上面的流水线来提出多边形,就显得力不从心了,因为这意味着在每次移动摄像机的时候都要对场景中的所有的物体进行视椎体的剔除及背面消隐,而这根本是不肯能的。

因此,就迫切一种方法,能快速的对大部分场景进行剔除操作。进一步说就是,能根据当前视点位置快速得到当前可见的多边形集合。

而这就需要对空间进行有效的划分,即对物体要有一个有效的管理。

 

常见空间划分算法有:

BSP、BHV、OCTREE等

 

常见的可见性算法有:

PVS、OC、portal等

 

下面先对最重要的BSP算法进行简单的分析:

 

BSP树的原理:使用分割面将空间划分成凸形子空间构成的二叉树。

BSP树的应用:

<1>大规模剔除物体。

<2>碰撞检测。

<3>可以根据视点的位置很快的确定当前正确的渲染顺序(从后到前或从前到后)。(注:现在的游戏99%都不采用该方法进行渲染)

 

根据BSP树的原理,很容易联想到,如果把多边形自身作为分割面,则有可能在拥有很多房间或关卡的室内场景游戏中发挥作用。

具体来说就是以多边形链表作为输入提供给空间划分系统来创建BSP树。

步骤:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一个简单的例子是多线程中对共享变量的访问。假设有一个共享变量x,多个线程可能会同时对它进行读写操作。如果没有正确使用同步机制,就可能出现可见问题。 例如,一个线程可能将x的值修改了,但是另一个线程并没有看到这个修改。这是因为线程之间的缓存不一定是同步的,一个线程对变量的修改可能还没有被刷新到主存中,另一个线程就已经从自己的缓存中读取了这个变量,导致出现不一致的结果。 下面是一个简单的示例代码,展示了可见问题的出现: ``` class VisibilityDemo { private static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while (flag) { System.out.println("Thread 1 is running"); } System.out.println("Thread 1 is done"); }).start(); Thread.sleep(1000); flag = false; System.out.println("Main thread sets flag to false"); } } ``` 该代码启动了两个线程,一个线程不断打印信息,另一个线程修改共享变量flag的值为false。由于没有使用同步机制来保证可见,因此第一个线程可能无法看到flag的修改,导致它无法退出循环。 可以通过使用volatile关键字来解决可见问题,它可以确保变量的修改被立即刷新到主存中,从而保证其他线程可以看到最新的值。修改后的代码如下: ``` class VisibilityDemo { private static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while (flag) { System.out.println("Thread 1 is running"); } System.out.println("Thread 1 is done"); }).start(); Thread.sleep(1000); flag = false; System.out.println("Main thread sets flag to false"); } } ``` 在这个版本中,flag变量的声明加上了volatile关键字,保证了可见。运行该代码,可以看到第一个线程可以正确退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值