OpenGL-如何渲染许多不同的模型?

OpenGL-如何渲染许多不同的模型?,opengl,3d,rendering,cubes,Opengl,3d,Rendering,Cubes,我目前正在努力寻找一种好方法来渲染许多(数千)略有不同的模型。该模型本身是一个具有一些顶点偏移的简单立方体,可以考虑一个倾斜的四边形面。每个“块”都有不同的顶点偏移量,所以基本上我有一个基于类固醇的体素引擎,因为每个块不是一个完美的立方体,而是一个倾斜的长方体。要渲染此形状,需要48个顶点,但可以切割为24个顶点,因为只有3个面可见。使用索引,我们有12个顶点(每个面4个) 但是,现在我有了世界上每个块的顶点,如何渲染它们 我所尝试的: 实例渲染。听起来不错,不起作用,因为我的模型不一样。

我目前正在努力寻找一种好方法来渲染许多(数千)略有不同的模型。该模型本身是一个具有一些顶点偏移的简单立方体,可以考虑一个倾斜的四边形面。每个“块”都有不同的顶点偏移量,所以基本上我有一个基于类固醇的体素引擎,因为每个块不是一个完美的立方体,而是一个倾斜的长方体。要渲染此形状,需要48个顶点,但可以切割为24个顶点,因为只有3个面可见。使用索引,我们有12个顶点(每个面4个)

但是,现在我有了世界上每个块的顶点,如何渲染它们


我所尝试的:
  • 实例渲染。听起来不错,不起作用,因为我的模型不一样。 我可以将远处的块简化为立方体,并使用glDrawArraysInstanced/GLDrawerElementsInstanced渲染它们

  • 把一切都放在一个巨大的VBO中。这比单独渲染每个立方体有更好的性能,但也有一个大网格的缺点。这是不可取的,因为我需要每个立方体有不同的纹理,照明等。。。在那个巨大的网格中选择一个立方体是不可能的

我知道截头体剔除和遮挡剔除,但我面前的一些立方体已经有问题(使用128x128世界进行测试)


我的要求:
  • 画上几千个模型

  • 每个模型都有顶点偏移,以使块不那么立方,存储在另一个VBO中

  • 每个块必须是一个单独的对象,因为您应该能够放置/删除块

  • 有什么好的绩效建议吗

    这是不可取的,因为我需要每个立方体有不同的纹理,照明等。。。在那个巨大的网格中选择一个立方体是不可能的

    程序员应该避免声明某些事情是“不可能的”;它限制了你的思维

    给这些立方体的每个面赋予不同的纹理有许多解决方案。Minecraft方法使用纹理地图集。每个“纹理”实际上只是一个大纹理的一个子部分,您可以使用纹理坐标来选择特定面使用的子部分。但你可能会变得更复杂

    允许采用更直接的方法来解决此问题。在这里,纹理坐标是相同的,但使用逐顶点整数为面选择正确的纹理。特定面的所有顶点都将具有索引。如果你很聪明,你甚至不需要纹理坐标。可以在顶点着色器中基于逐顶点值(如
    gl\u VertexID
    等)生成它们

    照明参数的工作方式相同:使用一些逐顶点数据从UBO或SSBO中选择参数

    至于“单个对象”部分,那只是你如何思考问题的问题。不要把玩家的想法和你的代码混淆起来。游戏是一种精心制作的幻觉;仅仅因为用户认为某个对象是“单个对象”,并不意味着它是渲染引擎的对象

    您需要的是修改世界数据以删除和添加新块的能力。如果需要将块显示为“选定”或其他内容,则只需另一个“每个块”值(如纹理的照明参数和索引),它告诉您是将其绘制为“选定”块还是“未选定”块。或者,您可以只重新绘制特定的选定块。有很多方法来处理它

    这是不可取的,因为我需要每个立方体有不同的纹理,照明等。。。在那个巨大的网格中选择一个立方体是不可能的

    程序员应该避免声明某些事情是“不可能的”;它限制了你的思维

    给这些立方体的每个面赋予不同的纹理有许多解决方案。Minecraft方法使用纹理地图集。每个“纹理”实际上只是一个大纹理的一个子部分,您可以使用纹理坐标来选择特定面使用的子部分。但你可能会变得更复杂

    允许采用更直接的方法来解决此问题。在这里,纹理坐标是相同的,但使用逐顶点整数为面选择正确的纹理。特定面的所有顶点都将具有索引。如果你很聪明,你甚至不需要纹理坐标。可以在顶点着色器中基于逐顶点值(如
    gl\u VertexID
    等)生成它们

    照明参数的工作方式相同:使用一些逐顶点数据从UBO或SSBO中选择参数

    至于“单个对象”部分,那只是你如何思考问题的问题。不要把玩家的想法和你的代码混淆起来。游戏是一种精心制作的幻觉;仅仅因为用户认为某个对象是“单个对象”,并不意味着它是渲染引擎的对象

    您需要的是修改世界数据以删除和添加新块的能力。如果需要将块显示为“选定”或其他内容,则只需另一个“每个块”值(如纹理的照明参数和索引),它告诉您是将其绘制为“选定”块还是“未选定”块。或者,您可以只重新绘制特定的选定块。有很多方法可以处理它。

    任何像样的图形卡(大约从2010年开始)都可以在眨眼间渲染数百万个顶点。 根据每帧更改的数量不同,方法也不同。换句话说,每帧必须传输多少数据到GPU

    对于少量更改,将数据存储在一个大型VBO或多个小型VBO(及其VAO)中,通过制服发送更改,并调用多个glDraw***,显示出类似的性能。不同的硬件性能差别不大。索引数据可以提高速度

    <