我注意到大多数3D游戏/渲染环境都将实体表示为(通常为三角形) 3d多边形的网格。然而,一些示例(例如Second Life或PovRay)使用从一组 3d基元(立方体,球体,圆锥体,圆环体等)构建的实体,其中可以进行各种操作执行以创建更复杂的形状。
所以我的问题是:为什么选择一种方法而不是来表示三维数据?
我可以看到,复杂的光线跟踪操作可以将表面描述为单个数学函数(如PovRay所做的那样),但SL肯定不会尝试使用渲染引擎这么雄心勃勃。< / p>
同样,我可以想象,提供广义实体的描述而不是任意网格可能带来更高的带宽效率,但是它真的值得SL遭受的缺点(即建模的东西真的很难,而且结果通常都是丑陋的) - 这只是SL开发早期做出的一个糟糕决定,他们现在已经陷入困境了?或者它是OpenGL / DirectX中最容易实现的人工制品?
编辑: 到目前为止已经阅读了答案,我现在认为我的两个例子使用prims有非常不同的原因:
对于PovRay,prims可能是将实体描述为数学函数的副作用,这为复杂的光线追踪带来了好处。
对于性能原因,Second Life似乎主要关注参数化他们的三维元素(作为prims和参数化的人物形象)......我认为它对于在线游戏非常有意义。 / p>
答案 0 :(得分:2)
更高级别的“基元”(球体,立方体等)带有更多关于它们究竟是什么的语义信息,以及更低的带宽/存储要求(球体需要2个参数 - 中心位置和半径 - 同时,比如,一个isosphere需要尽可能多的三角形来渲染球体。
使用基元还允许客户端引擎根据本地功能调整其呈现。如果你说“sphere”,一个客户端可以用M细分渲染而另一个用N渲染;如果发送三角形,则缺少以不同分辨率重新渲染所需的信息。此外,它还为您提供了一些机会,例如在靠近物体时增加细分计数。
我不知道Linden Labs在想什么,因为我从未与Second Life合作,但如果我正在构建类似于SL的东西,我可能会倾向于将原语作为定义和传输格式,因为它们带有更多可以用于重新渲染,命中检测等的信息。当然,最终它们将被转换为多边形以进行渲染,但这是一个实现细节。
答案 1 :(得分:1)
有两种描述和渲染3D对象的方法:
SL 可能使用原语,因为他们的引擎API可能允许您执行类似
的操作Sphere mySphere = engine->createSphere(x,y,z);
mySphere->moveTo(x,y,z);
但那些只是辅助函数(大多数现代引擎都具有原始功能),这并不意味着它们呈现“原始”。他们仍然渲染三角形。
所以基本上,这不是一个问题,你何时使用“对象”以及何时使用“多边形”。这是你想要光线追踪还是你想要以交互方式呈现的问题。
答案 2 :(得分:1)
它几乎肯定与OpenGL无关,因为OpenGL(和DirectX)可以处理三角形,而不是曲面或几何图元。因此,林登实验室不太可能使用更高级别的库,这使得渲染基元比三角形网格更容易。
我预计它几乎完全取决于节省带宽的愿望,因为几何表示几乎总是小于表示为细分三角形的相同对象(以进行详细调整为代价是昂贵或不可能的)。这对于主要由用户创建的内容的在线游戏很重要,因为大部分流量都是将这些数据发送给客户。
答案 3 :(得分:0)
根据定义,多边形可以表示任何其他几何图元。多边形上的每个操作(例如找到其中一个表面的法线向量)都是相同的,多边形是立方体,球体或其他任何东西。这种方法的缺点是,您需要针对边缘情况进行专门优化(同样,多维数据集就是一个很好的例子)。使用法线贴图等高级技术可以减少这种影响,因为可以预先计算重要的对象指标。
我可以想象PovRay是一种能够将对象表达为简单函数并针对边缘情况进行优化的能力,可以产生巨大的性能提升,但代价是需要更复杂的场景设计师。
使用多边形为设计师提供了更多的自由度,您可以通过简单地增加或减少所涉及的多边形数量来表示任意级别的细节(LoD调整)。
我不知道为什么SL的创造者决定使用原语,我也不知道游戏的细节,但我认为高端渲染是次要问题。