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