【问题标题】:can i use a single vertex index with a vertex buffer with all attributes (position, normal, texCoord) [duplicate]我可以将单个顶点索引与具有所有属性(位置,法线,texCoord)的顶点缓冲区一起使用吗?
【发布时间】:2017-11-20 03:17:53
【问题描述】:

iam 使用 COLLADA 加载 3D 资产,我想将位置、法线和 texcoord 数据交织到一个结构数组中并使用顶点索引来绘制对象,但是顶点属性的计数不同(例如:位置有 24值,法线有 36 个值 ..etc),我能够通过将属性重新排列到预定义的结构数组中来加载模型,但是这次我必须在不使用索引缓冲区的情况下加载模型,是否可以将这些属性交织成一个数组并使用索引缓冲区?加载模型的最佳方法是什么,可以获得最佳性能增益。

我的结构应该是这样的

struct vertexAttribs
{
    glm::vec3 position;
    glm::vec3 normals;
    glm::vec2 texCoord;
}

【问题讨论】:

    标签: c++ 3d collada vulkan


    【解决方案1】:

    使用索引缓冲区是一个全有或全无的交易。要么所有属性都使用索引缓冲区,要么没有属性使用它。

    您将有一个 VkVertexInputBindingDescriptionstride = sizeof(vertexAttribs) 和一个 VkVertexInputAttributeDescription 用于其中的每个属性,并使用与 VkVertexInputBindingDescription 相同的 binding 匹配 offsets 和 formats。

    【讨论】:

    • 问题是位置和法线计数不匹配计数值不同,在我的示例中,位置有 24 个值,法线有 36 个,除非我为每个使用索引缓冲区,否则不可能交错值将它们重新排列到一个新的缓冲区数组中,但是当我这样做时,我必须避免索引绘图命令。
    • 不可能只有一个索引缓冲区并且所有属性都使用相同的索引。您将需要复制数据。
    • 谢谢你,我想我会坚持使用普通绘图而不是索引绘图,作为最后一个问题,你知道为什么立方体模型会有 24 个唯一位置值但有 36 个正常值吗?它们不应该彼此一致吗?
    • 在立方体的角落,您只需要一个位置,但每个立方体面需要一个法线。如果您尝试使用单个法线,它可能会指向三个相邻面的法线方向的平均值,从而导致任何涉及法线(例如照明)的计算将角落和边缘视为面之间的平滑混合,而不是硬/锋利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多