【问题标题】:implementing Level of Detail algorithm for OpenGL实现 OpenGL 的细节层次算法
【发布时间】:2011-12-02 08:03:28
【问题描述】:

我正在尝试实现以下算法(打破画成小三角形),但我在网上找不到任何能正确解释它的教程, 我发现的大多数东西都在理论上解释了它,而样本太复杂而无法理解,因为它们包含许多其他东西。

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

【问题讨论】:

  • 这是一个相当复杂的过程,图形编程是一个充满秘密的世界。
  • “破画成小三角形”是什么意思?
  • 您的意思是要问“我有一个包含大量多边形的多边形网格,我想对其进行超采样以创建不太详细的版本,以便从远处查看”?
  • 嘿,感谢 cmets,对于这次讨论,我有大约 200K 点,并且从每个点我绘制一个从其邻居构建的矩形多边形,因此 glvertex 调用的总数约为 1M+-,这个使我的整个程序运行缓慢,我设法找到的解决方案之一是使用细节级别算法,这意味着将我的顶点分成小三角形,这减少了要打印的多边形的总和,大多数文章我发现很复杂,那里写的大部分都是理论性的,实现的很复杂
  • @igalk:正如 Jan 指出的那样,这是因为它 很复杂。它不能简单,因为它并不简单。你只需要弄清楚它是如何工作的。如果你有具体的问题,你可以问。但是像这样的一般问题不适合这个网站。

标签: opengl graphical-programming level-of-detail


【解决方案1】:

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

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

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

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

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

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

我不会发布任何关于 VBO 的代码,因为那样的话这篇文章会比现在长 4 倍。我想我给了你很多关键词,你可以用谷歌搜索更多信息。以下是一些我建议您从了解该主题开始的内容(单独搜索):

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

如果您在实施我提到的任何内容时遇到任何问题,那么我建议您打开一个新的特定问题。

祝你好运!

【讨论】:

  • 确实很棒的评论!我只是想提一下,我不打算每帧都更改我的数据,这实际上取决于用户,如果用户决定缩放,我的程序实际上会计算 Mandelbrot 集(参见分形)并在屏幕上打印 3d 模型在每 0.3 秒内,数据会迅速变化,然后我猜 VBO 将无用,但如果他决定“探索器”设置,那么 VBO 就可以了......
猜你喜欢
  • 2017-12-20
  • 2011-05-26
  • 1970-01-01
  • 2015-01-20
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多