代码之家  ›  专栏  ›  技术社区  ›  Jeff Storey

Java-OpenGL绘制多个三角形

  •  2
  • Jeff Storey  · 技术社区  · 14 年前

    我尝试过使用显示列表,然后在每次调用之前缩放/旋转 glCallList . 这是可行的,但它会让系统陷入困境。我已经考虑过使用顶点缓冲区,但我不确定这是否是合适的方法,因为我需要在每次渲染时旋转/缩放。

    编辑

    该应用程序是一个地图应用程序,显示世界的三维视图。有一些特定的形状需要画在表面上,指向一个相对于指南针的方向,即30度。用户可以旋转三维视图,但形状必须在地球表面保持平坦,并指向指定的方向。

    谢谢, 杰夫

    2 回复  |  直到 14 年前
        1
  •  5
  •   Ned Bingham    14 年前

    在简单性方面,使用GL\u DYNAMIC\u DRAW的顶点缓冲区和使用GL\u STATIC\u DRAW的索引缓冲区是最好的选择。

    如果可以访问明暗器(GLSL或HSL),请将顶点缓冲区与GL\u STATIC\u DRAW一起使用,并使用GL\u STATIC\u DRAW指示缓冲区,然后计算顶点明暗器中的比例和旋转。这样你就可以把一些工作放到GPU上。(如果这项工作一开始是CPU繁重的话)

    也许在动手之前做些截头台剔除?遮挡剔除?加速应用程序的最佳方法是减少渲染的三角形数量。

    甚至可以使用一些线程。一个线程用于渲染,另一个线程用于计算比例和角度。

        2
  •  1
  •   Kos    14 年前

    10000个三角形对于今天的普通笔记本GPU来说也不是一个大数目。

    显示列表有点过时了,这不是最有用的方法。

    首先要做的是 在一次抽签中画出你的三角形 -这应该很容易做到。

    所以:

    将所有三角形数据(顶点坐标)保存在一个 Buffer (这就是JOGL处理顶点数组的方式,IIRC)。那么:

    • 在CPU上的每一帧更新这个缓冲区,并使用 glVertexPointer glDrawArrays ,
    • 创建VBO和( GL_DYNAMIC_DRAW 输入),并用此缓冲区更新每一帧。这是一种更现代的方法,但在速度方面与上述方法并没有太大的区别。

    GLDRAW阵列 打电话。

    这仍然会将三角形的计算留在CPU上,但会节省您在驱动程序调用上花费的大量CPU时间—所有三角形都会一次通过PCI-E发送并在瞬间渲染。

    如果仍然太慢:

    想一想,如果你能/想把三角形上的一些操作移到GPU上,并在顶点着色器中进行计算。在我知道你在做什么计算之前,我不能在这里说太多,但我真的希望这已经足够了。

    如果你有10000个电话 CallList 每一帧,这绝对是你表现不佳的罪魁祸首。