一个简单的立方体将生成 8 个顶点、36 个法线和 12 个纹理坐标,
不,一个简单的立方体有 8个位置,但一个顶点不仅仅是一个位置,还包含所有其他属性。所以实际上没有发生顶点重复,但你是对的,你会在属性中有一些冗余。
更新解释,为什么会这样
顶点是其属性的整个向量。换一个,你有一个完全不同的顶点。
假设您有一个顶点着色器,它采用一组纯抽象属性和一个纹理坐标
#version 150
attribute vec2 foobar;
attribute vec4 fnord;
attribute vec2 texcoord;
这个顶点着色器根据这些属性计算一些位置,比如说
void main() {
gl_Position = vec3(fnord.xw, dot(foobar,texcoord));
}
如您所见,顶点位置现在直接取决于所有属性。但当然其他变化也可以。
为了节省冗余计算,GPU 维护从顶点属性输入到转换阶段/顶点着色器输出的缓存映射。如果通过索引间接访问顶点,那么缓存实际上使用索引作为键。
所以请记住:如果与顶点相关的任何内容发生更改,则您会更改整个顶点。而在现代 OpenGL 中,顶点的属性,甚至位置,最终可能会做非常不同的事情。
这些功能似乎没有内置到我的 openGL 版本中
哦,他们可能是你司机的一部分,好吧。您可能只是没有将它们加载到您的程序中。OpenGL DLL 仅涵盖非常基本的内容。对于其他所有内容,您必须动态加载函数指针。只需为此使用像 GLEW 这样的漂亮包装器(可在http://glew.sourceforge.net获得)。