【问题标题】:How to have multiple storage layouts in one Vertex Array Object?如何在一个顶点数组对象中有多个存储布局?
【发布时间】:2016-09-26 20:16:27
【问题描述】:

当我说存储布局时,我的意思是我用glVertexAttribPointer 定义的。这个状态是保存在当前绑定的 VAO 中还是我绑定到 GL_ARRAY_BUFFER 的缓冲区中?

【问题讨论】:

    标签: opengl vertex-buffer vertex-array vertex-attributes vertex-array-object


    【解决方案1】:

    您不能在一个 VAO 中拥有多个“存储布局”。这与您不能在一个纹理对象中拥有多个纹理的原因相同。或一个缓冲区对象中的多个缓冲区。以此类推。

    VAO “存储布局”。因此,如果您需要多个布局,那么您需要多个 VAO。

    或者你可以修改现有VAO的状态;它们不是一成不变的。但这有点违背了 VAO 的目的。

    【讨论】:

    • 我有工作代码,首先定义并启用我的标准顶点属性(位置和法线),然后再次定义并启用我用于模型的 other 顶点属性矩阵(使用实例化数组)。然后我做draw call。虽然我用我的第二个glVertexAttribPointer 更改了 VAO 状态,但在渲染过程中仍然可以找到标准属性。这怎么可能?
    • @mak:“这怎么可能?”我不知道;我没有看你的代码。没有这个,我所能做的就是根据你描述你的代码要做什么来猜测。
    • 好的,这就是我正在做的事情,1. 生成并绑定 VAO 2. 生成并绑定 VBO 3. 将顶点数据(位置和法线)发送到 GPU 4. glVertexAttribPointer 和 glEnableVertexAttribArray 用于位置和正常 5. 生成并绑定另一个 VBO 6. 上传模型矩阵 7. 使用程序 8. 设置制服 9. 模型矩阵列的 glVertexAttribPointer、glEnableVertexAttribArray 和 glVertexAttribDivisor 10. glDrawArraysInstanced 11. 着色器中可用的一切我不应该覆盖位置和正常与模型矩阵列?
    • @mak:如果您想回答这个问题,请将其放在您的问题中,在那里可以合理地格式化。另外,这是一个与 this one 非常不同的问题,因此请单独提出。哦,最好放上你的实际代码,而不是描述它。如果有错误,我们无法区分您想要做什么和您写的内容。
    • 好的,我已经创建了this question
    【解决方案2】:

    您给 glVertexAttribPointer 的“描述”存储在 VAO 状态中。

    因此,对于同一个 VBO,您可以在同一个 VAO 或其他 VAO 的不同属性中对其进行不同的设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多