【发布时间】: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