为 OpenGL 实现细节层次算法

iga*_*l k 2 opengl graphical-programming level-of-detail

我正在尝试实现以下算法(分解为小三角形),但我在网上找不到任何可以正确解释它的教程,我发现的大多数内容都从理论上解释了它,并且示例也太棒了理解起来很复杂,因为它们包含许多其他东西。

如果您能指出我是如何完成的或类似的事情,我将非常感激。

And*_*sen 5

从您的评论来看,您似乎正在调用 glVertex 一百万次,这意味着您正在使用已弃用的 OpenGL 函数,这可能就是您的程序运行如此缓慢的原因。

回到过去(不是我真的知道,我才 20 岁),您使用 glVertex 指定顶点,一次一个,每帧一次。这称为立即模式。这会将顶点信息每帧每个顶点传递到 OpenGL 内存(通常是显卡)一次。因此,如果你有 200k 个顶点,正如你所说,你每帧至少要执行 200k 次(如果你使用索引,你可以将其减少到恰好 200k,但是你必须传递一些其他东西)。

我怀疑所有这些顶点每一帧都在改变。我敢打赌,它们中的许多甚至全部在多个帧中都保持不变。所以你能做的就是把它们放入一个叫做 VBO(顶点缓冲对象)的东西中,这意味着你将所有这些顶点信息存储在 OpenGL 内存中(同样,如果你有的话,可能是 gfx 卡),然后你就不需要了不必每帧都传输所有这些东西。

一开始有点难以理解。但本质上调用 glVertex 一百万次就像在每一帧都说:“这是我需要你绘制的一堆信息。” 你每一帧都说同样的话。使用顶点缓冲区对象就像说一次:“这里有一堆信息”,然后每帧说一次:“还记得我不久前给你的信息吗?画出来。”

这显然要快得多,因为您不必每帧都转发信息。

一个缺点是,如果您需要更改顶点,则会有点棘手,因为数据不再由您控制。在这种情况下,您必须获取 vbo 内容的内存映射并对其进行修改,而不是传递新数据。或者您始终可以删除它并重新生成它,但如果您每帧都这样做,那么在立即模式上使用 vbo 就没有意义了。

我不会发布任何有关 VBO 的代码,因为这样这篇文章的长度将比现在长 4 倍。我想我已经给了你很多关键词,你可以用谷歌搜索来找到更多信息。我建议先从以下几个方面开始了解该主题(单独搜索它们):

顶点缓冲区对象、索引、固定功能管道、着色器

如果您在实施我提到的任何内容时遇到任何问题,那么我建议您提出一个新的具体问题。

祝你好运!