当前位置: 首页 > 知识库问答 >
问题:

OpenGL多少VAO

谢奕
2023-03-14

我正在编写一个OpenGL3+应用程序,对VAOS的使用有些困惑。现在我只有一个VAO,一个围绕原点设置的正规化的四方。这个单个VAO包含3个VBO;一个用于位置,一个用于曲面法线,一个用于索引的GL_ELEMENT_ARRAY_BUFFER(所以我只能存储4个顶点,而不是6个)。

  • 绑定四方vao.
  • 每立方体面:
    • 创建表示此面孔的模型矩阵。
    • 将模型矩阵上载到统一mat4模型顶点着色器变量。
    • 调用gldrawelements()将四边形绘制到这个面的位置。

    我刚刚开始了添加每立方体颜色的任务,并意识到我不能将我的颜色VBO添加到单个VAO,因为它会随着每个立方体的变化而变化,这感觉不对。

    我刚刚读过这个问题;OpenGL VAO最佳实践,它告诉我我的方法是错误的,我应该使用更多的VAO来节省每次设置整个场景的工作。

    应该使用多少VAOs?很明显,我的方法有1不是最优的,应该有一个VAO为每个静态表面在场景中?会动的呢?

    我在为每个顶点写一个统一的变量,对吗?我读到uniforne着色器变量不应该改变中间帧,如果我能够向我的uniforn变量写入不同的值,那么在顶点着色器中,变量中,unifornem与简单的有何不同?


共有1个答案

卢德惠
2023-03-14

很明显,我的方法有1不是最优的,应该有一个VAO为每个静态表面在场景中?

绝对不行.切换VAOs成本很高。如果你为场景中的每个对象分配一个VAO,你需要在渲染这些对象之前切换VAO。将其缩放到当前可见的几百或几千个对象,您将得到同样多的VAO更改。问题是,如果您有多个对象共享一个共同的内存布局,即元素的大小/类型/规范化/步幅都是相同的,为什么要定义多个存储相同信息的VAO?通过相应的draw调用,可以控制要开始直接拉取顶点属性的偏移量。

对于非索引几何来说,这很简单,因为您为gl[Multi]drawarrays*()提供了first(或在multi-draw情况下的偏移量数组)参数,该参数将偏移量定义到关联的array_buffer的数据存储中。

能够向缓冲区存储提供偏移量还意味着可以在单个ARRAY_BUFFER中存储多个不同的对象,并在单个element_array_buffer中存储相应的索引。但是,缓冲区对象应该有多大取决于您的硬件和供应商的不同建议。

我在为每个顶点写一个统一的变量,对吗?我读到均匀着色器变量不应该改变中间帧,如果我能够写不同的值到我的均匀变量,如何制服不同于简单的变量在顶点着色器?

首先,在不同的实例中,声明为in/out的制服和着色器输入/输出变量是不同的:

>

  • 输入/输出变量定义着色器阶段之间的接口,即一个着色器阶段中的输出变量由下一个阶段中相应且名称相同的输入变量支持。如果用相同的名称声明,制服在所有阶段都可用,并且在应用程序更改之前是恒定的。

    顶点着色器中的输入变量是从array_buffer填充的。一致块内的一致被一个uniform_buffer备份。

    输入变量也可以直接使用glvertexattrib*()函数族编写。单制服是使用gluniform*()函数族编写的。

    glVertexAttribPointer(0, 4, ....);
    

    glVertexAttribPointer(1, 3, ....);
    

    可以定义两个数组,索引为0和1,组件大小为3和4,都引用顶点的位置属性。但是,根据您想要呈现的内容,您可以绑定一个假设的顶点着色器输入

    // if you have GL_ARB_explicit_attrib_location or GL3.3 available, use explicit
    // locations
    /*layout(location = 0)*/ in vec4 Position; 
    

    /*layout(location = 1)*/ in vec3 Position;
    

    您是从相同的还是不同的缓冲区对象中为所述属性源数据是另一个问题,但当然是可能的。

    就我个人而言,我倾向于在每个布局中使用一个VBO和VAO,也就是说,如果我的数据由具有相同属性的相同数量的属性组成,我将它们放入一个VBO和一个VAO中。

    一般来说:您可以尝试这些东西很多。动手吧!

  •  类似资料:
    • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但

    • 我正在评估是否需要为ASE分区表。我们需要执行一些典型的DB操作,如CRUD,但不需要复杂的查询。您知道通常情况下,ASE可以处理多大的表,并具有良好的性能吗?比如有多少行,总大小有多大? 谢谢

    • 问题内容: 我正在建立一个可能有70列以上的表格。我现在正在考虑将其拆分,因为每次访问表时都不需要列中的某些数据。再说一次,如果我这样做,我就不得不使用联接。 在什么时候(如果有的话)是否认为列太多? 问题答案: 一旦超过数据库支持的最大限制,就认为它太多了。 不需要每个查询都返回所有列的事实是完全正常的;这就是为什么SELECT语句可让您显式命名所需的列的原因。 通常,您的表结构应反映您的域模型

    • 我刚刚实现了基本的opengl渲染到我的pyplay应用程序中,认为硬件加速会使程序运行得更快。相反,它要慢得多。 看起来问题是绘图功能。 这是我的opengl绘图功能 我的分析器为draw函数提供了什么 我的分析器文本的其余部分:(1个月后到期) http://pastebin.com/ApfiCQzw 我的源代码 https://bitbucket.org/claysmithr/warbots

    • 本文向大家介绍1in等于多少mm?1mm等于多少px?相关面试题,主要包含被问及1in等于多少mm?1mm等于多少px?时的应答技巧和注意事项,需要的朋友参考一下 1in == 96px 1mm == 0.1cm == 3.78px 1in == 96/3.78 mm

    • 在我的理解中:一个VAO代表一个特定的状态。如果我绑定了一个VAO,添加一些VBO和元素缓冲区,用于索引和东西,我可以保存我想绘制和激活的对象的某个状态,然后在我想渲染东西的时候轻松地绘制它们。对吧? 所以VBO保存实际数据,而VAO只是一个“包装器-对象”,保存指向我为它定义的所有缓冲区的指针? 更改VAOs成本很高(更改VBO也是如此?!)。目前,我加载网格,并将它们组合到模型中。每个模型都使