glDrawArrays vs glDrawElements w / Texture mapping

时间:2013-02-05 16:17:35

标签: c++ opengl

我周末用一个我为学校开发的简单Waveform OBJ导入器进行了实验。在这样做时,我读到了glDrawArrays和glDrawElements以及后者如何通过将顶点保持在缓冲区中以便于访问而不是重绘它们来优于前者。我开发了简单的算法来对我的顶点,纹理和普通数组进行排序以使用它们。但是,当使用gDE时,我无法将相同的顶点关联到不同的法线和/或纹理,因为它对所有3个缓冲区使用相同的索引。因此,绘制在不同多边形上的顶点保持它们在OBJ上的第一个外观中获得的相同纹理。这可以通过在缓冲区中根据需要写入相同的顶点n次来解决它们需要的正常/纹理值。但是,此解决方案将最终缓冲区结果转换为将用于gDA的相同缓冲区。所以,我的问题是:还有任何性能优势吗?或者是否有不同的解决方案来解决这个不便之处?

1 个答案:

答案 0 :(得分:1)

  

我无法将相同的顶点与不同的法线和/或纹理相关联,因为它对所有3个缓冲区使用相同的索引。

你陷入了一种常见的误解,即“顶点”等于“位置”。 情况并非如此!顶点是位置,法线,纹理坐标和您使用的所有其他属性的整个组合。您可以更改其中一个属性的值,并获得不同的顶点。因此,您需要做的是从OBJ文件中的面生成模型的实际顶点。

不幸的是,许多人因为“顶点”==“位置”的误解而陷入困境,因此您可以找到许多错误地用顶点替换位置的文件格式和规范。例如,在波前OBJ格式中,位置使用v而不是更明智的vp来定义。

在现代OpenGL中,称为“顶点”的数学对象与位置之间的区别变得非常明显,您必须提供顶点着色器,它将任意通用属性作为顶点输入,其中没有它们实际上需要是一个位置,并且可以从输入以任意方式创建剪辑空间位置。