gpt4 book ai didi

OpenGL处理​​多个对象

转载 作者:行者123 更新时间:2023-12-04 15:35:18 24 4
gpt4 key购买 nike

我在理解如何使用 OpenGL 处理/渲染多个对象时遇到了一点困难。我环顾四周,在谷歌和 OpenGL 红皮书中找到了答案,这些答案与我试图弄清楚的内容类似,但我需要看看我是否有正确的想法。

我的第一个想法是我应该分别处理带有 X、Y 和 Z 的平移和旋转变量的位置数据。将单个网格存储在该类的静态 VBO 中,然后对于我要渲染的每个实例执行 for-next 循环

  • 加载身份
  • 变换到特定对象的位置/旋转
  • 使用drawarrays在那个位置渲染网格
  • 循环到下一个对象并对每个对象重复上述操作

  • 为每个帧更新处理这样的转换是否会显着影响性能?

    有人提到的另一种方法是将每个顶点的所有位置数据粘贴在单个 VBO 中,然后通过单个调用对其进行渲染。在这种方法中,我假设“创建”一个对象,我需要通过一个函数处理每个顶点的位置数据,该函数将获取其局部坐标(通过静态数组)并将该特定对象的位置数据添加到顶点,然后将其存储在 VBO 中?如果是这种情况,我将如何处理旋转?

    我的第三个想法是在对象的每个实例中存储一个 4x4 矩阵来保存平移/旋转信息,然后当我去渲染时,我只需加载该对象的矩阵,从单个 VBO 绘制网格,然后加载下一个对象的矩阵,从同一个 VBO 中绘制,等等......

    最后,我看到有些人建议为每个对象设置一个 VBO,并为每个实例调用 drawarray。这种方式对我来说似乎非常低效,并且让我想知道如果您为每个网格都调用它,那么拥有 VBO 的意义何在。似乎立即模式(我知道它已贬值)会更快,因为您没有为每个对象创建和绑定(bind) VBO 的开销。

    这些处理/渲染多个对象的任何/所有方法是否有效?如果是这样,每种方法的优缺点是什么?

    最有意义的方法是每个网格有一个 VBO,然后在每次更新时转换它们,或者在每次更新时加载每个对象的矩阵并以这种方式渲染。我对 OpenGL 和图形渲染还很陌生,所以我试图完全理解处理渲染多个对象所需信息的最佳方法。

    最佳答案

    • transform to the specific object's location / rotation


    这只是意味着您将 4x4 矩阵加载到统一变量。

    Does handling the transformations like this for every frame update impact the performance significantly?



    转换将在您的顶点着色器中执行,通过将上述矩阵乘以顶点坐标,并行处理许多顶点。

    another method that someone was mentioning was sticking all of the locational data for every vertex in a single VBO then rendering it with a single call. In this method, I'm assuming to 'create' an object I would need to process each vertex's locational data through a function that would take its local coordinates (through the static array) and add that specific object's locational data to the vertex, then store it in the VBO? If that's the case, how would I handle rotation as well?



    这似乎不是一个好主意,因为您必须在每一帧上上传数据(或者至少在对象位置/方向发生变化时)。

    第三种方法似乎与第一种相同,只是在 OGL3+ 术语中,而第一种似乎在 OGL 2.x 术语中:)

    Finally, I've seen some people suggest having a VBO for every single object and calling drawarray for every single instance.



    也许您误解了,他们的意思是 VAO,而不是 VBO?使用 VAO,您上传顶点属性(在 VBO 中),绑定(bind) VAO,将每个 VBO 绑定(bind)到适当的属性位置,并且在开始时只执行一次。在每一帧上,您只需执行以下操作:
    // Bind the VAO
    glBindVertexArray(vao)

    // Draw the object
    glDrawArrays/glDrawArraysInstanced/etc.

    // CLear VAO binding
    glBindVertexArray(0)

    请注意,您仍然可以在同一个 VBO 中拥有许多不同对象的顶点属性,请记住 glDrawArrays和其他人有一个参数,它决定从数组中的哪个位置开始绘制。

    关于OpenGL处理​​多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507319/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com