【问题标题】:Deformable terrain in OpenGL 2D [Worms like]OpenGL 2D 中的可变形地形 [类似蠕虫]
【发布时间】:2011-10-04 21:07:45
【问题描述】:

我已经搜索了一段时间,我听说过不同的方法可以做到这一点,所以我想我会来这里看看我应该做什么,

根据我收集到的信息,我应该使用.. glBitmap 以及数组中的 0s 和 0xFF 值来制作地形。对此有任何意见吗? 我尝试将其切换为四边形,但我不确定这是否有效以及它的预期方式。

我希望地形能够有隧道,例如蠕虫。二维。

这是我迄今为止尝试过的,

我已经尝试制作一个 glBitmap,所以..

pixels = pow(2 * radius, 2);
ras = new GLubyte[pixels];

然后将它们全部设置为0xFF,并使用glBitmap(x, y, 0, 0, ras); 然后可以检查是否有爆炸,什么不是,任何像素都可以设置为零。这是一个合理的方法吗?我对opengl不太好,我可以在glBitmap上放一个纹理吗?就我所见,我认为你不能。

【问题讨论】:

  • OpenGL 仅用于绘图;变形地形是你的代码会做的事情,通过操纵内存中的数据,帧之间通过OpenGL。高地地形是否可以,或者您是否需要它来支撑洞穴和悬垂之类的东西? (高度域要简单得多。)
  • 是的,我喜欢像蠕虫一样的地形,能够建造隧道。
  • 您确实应该在发布之前仔细检查您的问题,并提供更多相关的详细信息和/或示例。
  • 对不起,我昨晚很晚才发的。我用我的尝试的一个小[坏]例子编辑它也更清楚了:!
  • 我觉得你的问题应该迁移到gamedev.stackexchange.com

标签: c++ opengl 2d


【解决方案1】:

我建议您使用模板缓冲区。您在模板缓冲区中标记地形的损坏部分,然后使用简单的四边形启用模板测试来绘制地形,而无需手动测试每个像素。

【讨论】:

  • 我正在研究这个,似乎是个好主意.. 只需要查找模板缓冲区,从未玩过它。
  • @Fouf - 查看 gamedev.stackexchange.com 以获取更多信息,例如gamedev.stackexchange.com/questions/13765/…gamedev.stackexchange.com/questions/3770/…
  • 嗯,我已经玩过并且模板缓冲区工作了,我只是好奇..我怎样才能检索这些数据..因为我想制作这个游戏多人游戏,我该如何告诉客户..该区域在哪里被摧毁?
  • 您可以使用glReadPixels 读取模板缓冲区,但如果我要实现这样的事情,我会保留形状方面的变形引用并在客户端之间同步(并将它们绘制到模板缓冲区)。从图形硬件到应用程序端的通信时,GL 驱动程序运行不快,而且同步整个模板缓冲区可能很慢。
  • 还有一件事,如果您的地图将渲染到比屏幕更大的区域,或者您可能会放大或缩小,您无论如何都需要重新绘制模板缓冲区。因此依赖于当前的模板缓冲区不会很有用。
【解决方案2】:

好的,这是一个高级概述,我假设您已经熟悉 OpenGL 基础知识,例如缓冲区对象。如果有什么不明白的地方或者您想了解更多细节,请告诉我。


在计算机图形中表示地形的最常用方法是高度场:在 X 轴和 Y 轴上规则间隔的点网格,但其 Z(高度)可以变化。高度场的每个 (X,Y) 网格点只能有一个 Z 值,因此您不能在地形中出现“悬垂”,但无论如何它通常就足够了。

绘制高度场地形的一种简单方法是使用三角形带(或四边形,但已弃用)。为简单起见,从一个角开始,以之字形顺序向下列发出顶点,然后返回顶部并执行下一列,依此类推。可以进行一些优化以获得更好的性能,并使用更复杂的方式构建几何以获得更好的外观,但这将帮助您入门。

(我在这里假设一个矩形地形,因为这通常是这样做的;如果你真的想要一个圆圈,你可以用?和?代替X和Y,这样你就有了一个极坐标网格。)

像往常一样,每个顶点的坐标都需要存储在缓冲区对象中。当您调用 glBufferData() 将顶点数据加载到 GPU 中时,如果地形通常会从一帧更改为下一帧,请指定 GL_STREAM_DRAWusage 参数,如果地形通常会从一帧更改为下一帧,则指定 GL_DYNAMIC_DRAW会经常变化,但不会(接近)每一帧。要更改地形,请再次调用glBufferData() 将一组不同的顶点数据复制到 GPU。

对于顶点数据本身,您可以为每个顶点指定所有三个坐标(X、Y 和 Z);这是最简单的事情。或者,如果您使用的是最新的 GL 版本并且想要更复杂,您应该能够使用gl_VertexID 和网格的尺寸(传递给着色器作为一个统一的值)。这样,您只需将 Z 值存储在缓冲区中,这意味着消耗的 GPU 内存和带宽更少。

【讨论】:

  • 其实我希望能够做隧道,就像蠕虫一样。抱歉不清楚,+1。
  • 而且是的,我将使用更简单的 2D,我相信您发布的是 3D,但我不确定 100%。 : o
  • 问题更新后,这个答案虽然通常很好,但不再回答问题。好吧,甚至以前都没有。
猜你喜欢
  • 2011-01-06
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多