【问题标题】:Should the indices of glVertexAttribPointer() be contiguous?glVertexAttribPointer() 的索引应该是连续的吗?
【发布时间】:2019-11-15 11:09:37
【问题描述】:

glVertexAttribPointer() 的第一个参数是表示顶点属性所在位置的索引,Opengl 提供至少 16 个插槽。

我希望所有 16 个顶点属性都代表不同的顶点属性(位置 = 0、uvs = 1、颜色 = 3、权重 = 8 等),并且这些属性在每个顶点类型中保持不变,即使顶点不使用那个属性。

我的问题是,如果索引对于给定顶点不连续,这有什么关系吗?例如,这会不会是低效的:

enum Attrib : GLuint {
    aPos        = 0,
    aUv1        = 1,
    aUv2        = 2,
    aColor1     = 3,
    aColor2     = 4, 
    aNormal     = 5,
    aTangent    = 6,
    aBitangent  = 7,
    aBoneIndex  = 8,
    aBoneWeight = 9,
    aAttrib1    = 10,
    aAttrib2    = 11,
    aAttrib3    = 12,
    aAttrib4    = 13, 
    aAttrib5    = 14,
    aAttrib6    = 15, 
    a__count    = 16
};

glVertexAttribPointer(aPos, ...);
glVertexAttribPointer(aUv1, ...);
glVertexAttribPointer(aAttrib1, ...);

【问题讨论】:

  • 多个顶点类型是否意味着多个着色器程序?
  • @Albjenow - 是的,有些需要不同的顶点属性。有很多着色器,但只有几个顶点类型
  • 如果在每个着色器程序中为属性类型使用相同的属性索引,可能会更容易处理不同的着色器。但是资源索引本身只是一个任意的正整数,你可以定义它。

标签: c++ opengl vertex vertex-attributes


【解决方案1】:

对顶点数组使用任意属性索引没有已知的性能损失。为了对此进行补充说明,最近的 API(如 Vulkan 和 D3D12)有机会强制执行属性索引的连续性。作为更底层的 API,如果通过这样的限制可以获得一些性能,他们就会强加它。

他们没有。

相比之下,Vulkan 有效地将顶点格式作为程序流水线状态的一部分,从而在程序和顶点格式之间实现了直接关联。因此,与 OpenGL 相比,Vulkan 并不是不愿意限制事物。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 2017-03-19
    • 2015-11-05
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2021-11-25
    相关资源
    最近更新 更多