周末我在用我为学校开发的一个简单的 Waveform OBJ 导入器进行试验。在这样做的同时,我阅读了 glDrawArrays 和 glDrawElements 以及后者如何通过将顶点保存在缓冲区中以便于访问而不是重绘它们来优于前者。我开发了简单的算法来对我的顶点、纹理和法线数组进行排序以同时使用它们。但是,当使用 gDE 时,我无法将相同的顶点关联到不同的法线和/或纹理,因为它对所有 3 个缓冲区使用相同的索引。因此,绘制在不同多边形上的顶点保持它们在 OBJ 上首次出现时获得的相同纹理。这可以通过在缓冲区中使用所需的法线/纹理值写入相同的顶点 n 次来解决。然而,该解决方案将最终的缓冲区结果转换为用于 gDA 的相同缓冲区。所以,我的问题是:还有性能优势吗?或者对于这种不便有不同的解决方案吗?
问问题
928 次
1 回答
1
我不能将相同的顶点关联到不同的法线和/或纹理,因为它对所有 3 个缓冲区使用相同的索引。
你陷入了一个普遍的误解,即“顶点”等于“位置”。不是这种情况!顶点是位置、法线、纹理坐标和您使用的所有其他属性的整体组合。您更改属性的值之一,您将获得不同的顶点。因此,您要做的就是从 OBJ 文件中的面生成模型的实际顶点。
不幸的是,许多人误以为“顶点”==“位置”,因此您会发现许多文件格式和规范错误地将位置替换为顶点。例如,在波前 OBJ 格式中,位置是用定义的,v
而不是更明智的vp
。
称为“顶点”的数学对象和位置之间的区别在现代 OpenGL 中变得非常明显,在现代 OpenGL 中,您必须提供一个顶点着色器,该着色器将任意通用属性作为顶点输入,其中没有一个实际上需要成为位置并且可以从输入以任意方式创建剪辑空间位置。
于 2013-02-06T14:40:01.447 回答