【问题标题】:Efficiency in drawing arbitrary meshes with OpenGL (Qt)使用 OpenGL (Qt) 绘制任意网格的效率
【发布时间】:2013-08-10 20:34:38
【问题描述】:

我正在使用 OpenGLQt 中编写关卡设计工具(相关示例参见 Valve 的 Hammer,因为我主要从事源游戏设计这个)并且目前已经编写了一些类来表示 3D 对象(顶点、边、面)。我计划实现一个 "object" 类,它将三者联系在一起,跟踪它自己的顶点等。

在阅读了http://open.gl 上的渲染多边形后,我有几个关于渲染内容的最有效方式的问题。请记住,这是一个关卡编辑器,所以我预计需要渲染大量具有任意形状和数量的顶点/面的对象。

编辑:更新为不那么广泛。

  • 什么时候创建 VBO 最好? Qt OpenGL 示例在初始化视口时创建了一个 VBO,但我认为为每个视口创建关闭是低效的。
  • 关于提交的答案,为几何创建一个 VBO、为网格模型创建另一个 VBO 等是否明智?如果/当 VBO 溢出时会发生什么?

【问题讨论】:

    标签: qt opengl


    【解决方案1】:

    VBO 应在需要时重新/初始化。将 VBO 视为内存池。因此,您不会为每个对象分配一个 VBO,而是将类似的对象分组到一个 VBO 中。当您在一个 VBO 中的空间不足时,您会分配另一个 VBO。

    当今的 GPU 已针对渲染索引三角形进行了优化。所以 GL_TRIANGLES 可以满足 90% 的所有情况。

    坦率地说,现代 OpenGL 实现完全忽略了缓冲区对象访问模式。如此多的程序确实错误地使用了该参数,因此分析使用模式并调整驱动程序行为变得更加有效。但是,使用正确的模式仍然是一个好主意。在你的情况下,它是 GL_STATIC_DRAW。

    【讨论】:

    • 好的,谢谢。因此,本质上,您使用特定 VBO 的可渲染对象并不重要,唯一的目的是将数据保存在(或至少靠近)GPU 上,以便可以快速访问它?有什么方法可以知道 VBO 何时已满?
    • @x6herbius:好吧,既然你用给定的大小初始化了 VBO,你所要做的就是用数据跟踪它的占用。实际上,VBO 代表一块连续的内存,可以填充任意数据。当然,要达到最大性能,您应该对齐其中的数据。因此,例如浮点数应该与sizeof(float) = 4 地址对齐。我建议在实际分配和填充 VBO 之前,首先收集一些有关要加载的所有数据的统计信息,并从中确定分配模式。
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多