我正在尝试实现以下算法(打破绘制到小三角形)但我找不到任何正确解释它的网络教程, 我发现的大部分内容在理论上都有解释,样本太复杂,无法理解,因为它们包含许多其他内容。
如果你可以指出我是如何完成的,或者类似的话,我会非常感激。
答案 0 :(得分:4)
从您的评论中看起来,您正在调用glVertex一百万次,这意味着您正在使用已弃用的OpenGL函数,这可能是您的程序运行速度慢的原因。
回到当天(不是我真的知道,我是20岁),你使用glVertex指定顶点,一次一个,每帧一次。这称为立即模式。这会将每个顶点每帧的顶点信息传递给OpenGL内存(通常是图形卡)一次。所以,如果你有200k顶点,正如你所说,你每帧至少做200k次(如果使用索引,你可以将其减少到200k,但是你必须将其他东西传递给)。
我怀疑所有这些顶点都在改变每一帧。我敢打赌,很多甚至所有人都在多个帧上保持不变。所以你可以做的就是将它们放入一个叫做VBO(顶点缓冲对象)的东西,这意味着你将所有这些顶点信息存储在OpenGL内存中(再次,如果你有一个,可能是gfx卡),然后你就不要必须每帧都传输所有这些东西。
起初有点难以理解。但基本上称glVertex一百万次,就像每一帧都说:“这是我需要你绘制的一堆信息。”而你在每一帧都说同样的话。使用顶点缓冲区对象就像这样说过:“这里有一堆信息”,然后每帧说一次:“还记得我给你一段时间的信息吗?画出来。”
这显然更快,因为您不必每帧都传递信息。
一个缺点是如果你需要改变顶点,那就有点棘手,因为数据不再由你控制。在这种情况下,您必须获取vbo内容的内存映射并进行修改,而不是传递新数据。或者您可以随时删除它并重新生成它,但如果您每帧都这样做,那么在立即模式下使用vbo是没有意义的。
我不会发布任何有关VBO的代码,因为这篇文章的版本会比现有版本长4倍。我想我已经为您提供了许多关键字,您可以谷歌查找更多信息。这里有一些我建议开始只是为了了解主题(单独搜索它们):
顶点缓冲区对象,索引,固定功能管道,着色器
如果您在实施我提到的任何内容时遇到任何问题,我建议您打开一个新的特定的问题。
祝你好运!