OpenGL-选择性世界渲染

OpenGL-选择性世界渲染,opengl,glut,Opengl,Glut,我正在建造一座微型城市,它具有城市的基本外观(道路、建筑物、树木等),你可以在这里走动。我知道在每个帧中渲染整个模型集不起作用 那么,有谁能给我一个关于仅选择性渲染系统可见部分的标准(但最简单)过程的见解吗?我的意思是,只显示可见的东西(相对于相机的位置),而不渲染看不见的部分。。 我正在使用VC++和GLUTAPI。谷歌“二进制空间分区树” BSP树是一种很好的方法,可以确定应该从摄影机的视角和位置渲染什么。老式的第一人称射击手,即Quake等人,使用了它们(或者至少是该原理的一些衍生) 这是

我正在建造一座微型城市,它具有城市的基本外观(道路、建筑物、树木等),你可以在这里走动。我知道在每个帧中渲染整个模型集不起作用

那么,有谁能给我一个关于仅选择性渲染系统可见部分的标准(但最简单)过程的见解吗?我的意思是,只显示可见的东西(相对于相机的位置),而不渲染看不见的部分。。 我正在使用VC++和GLUTAPI。

谷歌“二进制空间分区树”

BSP树是一种很好的方法,可以确定应该从摄影机的视角和位置渲染什么。老式的第一人称射击手,即Quake等人,使用了它们(或者至少是该原理的一些衍生)

这是一个好主意

其他良好资源:

也许可以为挑选技术领域提供一个非常基本的介绍

一个很好的起点和最简单的技术之一是视图截锥剔除。使用此方法,可以检查场景中的每个对象是否位于查看体积(查看平截体)内。这基本上相当于检查几何体(如完全包含几何体的长方体或球体)是否位于由六个平面定义的视锥体内的某些简化边界体积

这可以通过按对象位置分组对象并创建所谓的边界体积层次来进一步优化,例如,通过这种方式,您可以首先检查整个城市街区是否在查看体积内(通过使用包含整个街区的边界体积),并且仅当它在查看体积内时,您可以进一步检查各个房屋

更复杂的技术是遮挡剔除,这意味着检查一个对象是否完全隐藏在另一个对象后面。因为这些技术可能会变得更加复杂,所以(如果完成了)实际上应该在视图截锥剔除之后完成。OpenGL有硬件遮挡查询,可以帮助您确定对象是否实际可见,但它们需要一些额外的工作才能正常工作。特别是对于城市,可能会有特殊的二维遮挡剔除技术(很久以前我就听说过,不知道)


这只是一个非常宽泛的概述,请随意在谷歌搜索单个关键字。考虑到目前的趋势是将尽可能多的几何体批处理到一个绘图调用中,因此,如果额外的CPU开销值得(特别是对于复杂的遮挡剔除技术),仔细权衡总是一个好主意(顺便说一句,我希望您不要使用立即模式
glBegin/glEnd
,否则将其更改为顶点数组或更好的VBOs是您日程上的第一点)。但是查看平截体剔除可能是一个很好且简单的起点,特别是当城市变得相当大时。

有很多方法可以做到这一点。平截体剔除(仅绘制视图端口中的内容)、遮挡剔除(仅绘制未完全遮挡的内容)举两个例子。还有一种局部渲染技术,就是你开始画图,然后在达到这帧的阈值时间时停止。谢谢你@christian。我来看看这些。OpenGl是否提供了预定义的函数来帮助这些方法中的任何一种?或者我们应该从头开始实现算法?自从我在3D图形中是活跃的,所以我不是完全最新的,但主要取决于您决定下一步要发送什么。@培训这样的高级场景管理设施不属于OpenGL的范围。但实际上OpenGL执行截头体剔除(这里称为视图体积剪裁)在顶点处理阶段之后。这就是为什么只有顶点阶段(T&L或顶点着色器)受益于截锥体剔除,而不是光栅化或片段阶段(纹理或片段着色器)。但当然,CPU端也从较少的绘制调用中获益。OpenGL还支持遮挡查询,这是一种较低级别的查询,但可用于实现遮挡剔除技术。分割多边形的经典BSP树完全是当今的“尝试在单个绘制调用中尽可能多地批处理”的禁忌-优化的图形硬件。并且不要让以“.bsp”结尾的文件欺骗您,使您知道它与bsp树有关(可能在最远的意义上)。这些文件应该以“.pvs”结尾,如果你愿意的话。感谢你们的帮助和提供链接。我想我现在会选择截锥剔除。如果我能处理这些东西,也许会选择遮挡剔除…)