OpenGL 2D中的可变形地形 [类似Worms游戏]

4

我已经搜索了一段时间,并听说有不同的方法来实现这个,所以我想来这里看看我应该做什么。

从我收集到的信息来看,我应该使用.. glBitmap 和在数组中使用0和0xFF值来制作地形。对此有何建议吗? 我尝试将其切换为四边形,但我不确定这样是否高效且符合预期的方式。

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

以下是我迄今为止尝试过的:

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

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

然后将它们全部设置为0xFF并使用glBitmap(x,y,0,0,ras)进行绘制。这样就可以检查是否存在爆炸,并将任何像素设置为零。这是一种可行的方法吗?我不太擅长opengl,我能否在glBitmap上放置纹理?从我所见,我不认为可以。


1
OpenGL只是用于绘图的,而通过操作内存中的数据,在OpenGL绘制帧之间,变形地形是您的代码要做的事情。高度场地形可以吗?还是您需要它支持像洞穴和悬崖这样的东西?(高度场要简单得多。) - Wyzard
是的,我喜欢像“Worms”这样的地形,并具有挖掘隧道的能力。 - Fouf
在发布问题前,请务必仔细检查,并提供更多相关的细节和/或示例。 - Kromster
抱歉,我昨晚太晚发布了这个帖子。我已经进行了编辑,加入了一个[不好的]示例来更清晰地说明我的尝试:! - Fouf
我认为你的问题应该迁移到http://gamedev.stackexchange.com/。 - Tony
2个回答

3

好的,这是一个高级概述,我假设你已经熟悉了诸如缓冲对象之类的OpenGL基础知识。如果有什么不清楚的地方或者需要更多细节,请告诉我。


在计算机图形学中,表示地形最常见的方法是使用高度场:点网格按照X和Y轴平均间隔排列,但Z(高度)可能会变化。高度场每个(X,Y)网格点只能有一个Z值,因此无法在地形中创建“悬崖”,但通常已经足够。

用三角带(或四边形,但已弃用)绘制高度场地形的简单方法是从一个角开始并按锯齿状顺序向下输出列中的顶点,然后返回到顶部并进行下一列,以此类推。可以进行优化以获得更好的性能,并采用更复杂的构建几何方式以获得更好的外观效果,但这将使您入门。

(我假设这里使用的是矩形地形,因为这是常见的方式;如果您真的想要一个圆形,则可以替换X和Y为 和 以获得极坐标网格。)

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

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


实际上,我想要能够像蠕虫一样进行隧道传输。抱歉没有表达清楚,+1。 - Fouf
而且是的,我会选择更简单的2D,我相信你发布的是3D,但我不确定。: o - Fouf
在问题更新后,这个回答虽然总体上不错,但已经不再回答问题了。其实,在更新之前也没有回答。 - Christian Rau

3

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


我正在研究这个,看起来是个好主意。只需要查一下模板缓冲区,从未尝试过它。 - Fouf
2
@Fouf - 请查看gamedev.stackexchange.com以获取更多信息,例如http://gamedev.stackexchange.com/questions/13765/stencil-buffer-mask-calculation和http://gamedev.stackexchange.com/questions/3770/what-is-the-purpose-of-the-stencil-buffer-more-precisely-what-is-a-stencil-in。 - Tony
嗯,我已经尝试过并使模板缓冲区工作了,我只是好奇..如何检索这些数据..因为我想让这个游戏变成多人游戏,我该如何告诉客户端..哪个区域已经被摧毁了? - Fouf
1
你可以使用glReadPixels读取模板缓冲区,但如果我要实现这样的功能,我会以形状的形式保留变形的参考,并在客户端之间同步它们(并将它们绘制到模板缓冲区)。GL驱动程序在从图形硬件通信到应用程序端时不会快速工作,而且同步整个模板缓冲区可能会很慢。 - rgngl
1
还有一件事,如果您的地图将呈现在比屏幕更大的区域,或者您可能会缩放,那么您仍然需要重新绘制模板缓冲区。因此,依赖于当前的模板缓冲区并不是非常有用的。 - rgngl
好的,谢谢,这似乎是一个更好的想法。感谢您的所有帮助。所以对于任何影响地形的事情,我会记录下它发生了什么。我理解得对吗? - Fouf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接