我可以将单个顶点索引与具有所有属性(位置,法线,texCoord)的顶点缓冲区一起使用吗?
Posted
技术标签:
【中文标题】我可以将单个顶点索引与具有所有属性(位置,法线,texCoord)的顶点缓冲区一起使用吗?【英文标题】:can i use a single vertex index with a vertex buffer with all attributes (position, normal, texCoord) [duplicate] 【发布时间】:2017-11-20 03:17:53 【问题描述】:iam 使用 COLLADA 加载 3D 资产,我想将位置、法线和 texcoord 数据交织到一个结构数组中并使用顶点索引来绘制对象,但是顶点属性的计数不同(例如:位置有 24值,法线有 36 个值 ..etc),我能够通过将属性重新排列到预定义的结构数组中来加载模型,但是这次我必须在不使用索引缓冲区的情况下加载模型,是否可以将这些属性交织成一个数组并使用索引缓冲区?加载模型的最佳方法是什么,可以获得最佳性能增益。
我的结构应该是这样的
struct vertexAttribs
glm::vec3 position;
glm::vec3 normals;
glm::vec2 texCoord;
【问题讨论】:
【参考方案1】:使用索引缓冲区是一个全有或全无的交易。要么所有属性都使用索引缓冲区,要么没有属性使用它。
您将有一个 VkVertexInputBindingDescription
和 stride = sizeof(vertexAttribs)
和一个 VkVertexInputAttributeDescription
用于其中的每个属性,并使用与 VkVertexInputBindingDescription
相同的 binding
匹配 offset
s 和 format
s。
【讨论】:
问题是位置和法线计数不匹配计数值不同,在我的示例中,位置有 24 个值,法线有 36 个,除非我为每个使用索引缓冲区,否则不可能交错值将它们重新排列到一个新的缓冲区数组中,但是当我这样做时,我必须避免索引绘图命令。 不可能只有一个索引缓冲区并且所有属性都使用相同的索引。您将需要复制数据。 谢谢你,我想我会坚持使用普通绘图而不是索引绘图,作为最后一个问题,你知道为什么立方体模型会有 24 个唯一位置值但有 36 个正常值吗?它们不应该彼此一致吗? 在立方体的角落,您只需要一个位置,但每个立方体面需要一个法线。如果您尝试使用单个法线,它可能会指向三个相邻面的法线方向的平均值,从而导致任何涉及法线(例如照明)的计算将角落和边缘视为面之间的平滑混合,而不是硬/锋利。以上是关于我可以将单个顶点索引与具有所有属性(位置,法线,texCoord)的顶点缓冲区一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章