如何使用 OpenGL 创建“无限”世界

Posted

技术标签:

【中文标题】如何使用 OpenGL 创建“无限”世界【英文标题】:How to create "infinity" world using OpenGL 【发布时间】:2013-03-16 09:16:21 【问题描述】:

我需要使用 OpenGL 创建 GameOfLife,但我遇到了一个问题。此模拟中的整个世界是 100x100 单元格,但必须连接左右边缘以及顶部/底部。问题是我如何使用相机显示它,因为当右边缘在窗口中间时,我只看世界的右边部分,但我也应该看左边部分。

任务规范为:OpenGL 1.1 with C++, WinApi and glOrtho

【问题讨论】:

你试过什么? (听起来像家庭作业)。如果您尝试学习 opengl 并且这是某种教程,您应该停止并继续学习另一个教程,不推荐使用即时模式,因此您甚至不应该将其作为学习的起点。 是的,这是我的家庭作业,我知道我不应该学习这么过时的技术,但是如果它是我的主题,我该怎么办...... 你当然可以寻求帮助,即使是家庭作业,但你应该展示你已经做过的事情,以及你有问题的地方。否则你是不可能得到帮助的。 我不想要直接帮助,我只是想要一个提示,也许是一些功能,剩下的我可以找到自己。而且我的老师不是那种乐于助人的人…… 【参考方案1】:

使用着色器将您的世界之外的坐标转换到内部。由于您使用的是正交投影,使用片段着色器中的模计算应该很容易完成。

【讨论】:

嗯,我想这会很简单,但我不能在这个程序中使用着色器(对不起,我之前没有告诉它),我应该只使用基本的,没有任何扩展。也许这很重要,但我的相机一次只能移动大约一个单元格的大小。 @user2176624:这听起来像是某个老师或教授给你的家庭作业。如果是这样,请告诉您的老师/教授/助教,OpenGL 的固定功能管道已经被弃用了大约 10 年,现代 OpenGL 仅适用于着色器,计算机图形领域的雇主希望对着色器编程有深入的了解,并且固定功能管道现在仅具有历史意义。所以你不应该使用扩展和基本的“核心”配置文件?那么我建议你使用OpenGL-3核心配置文件:没有固定的功能,你必须使用着色器。【参考方案2】:

好吧,由于世界只有 100x100,而且我认为杀手级图形不是优先考虑的(彩色方块?),所以渲染场景两次应该不会太难,对吗?例如,在相机只看右边缘的情况下,只绘制场景最右侧的方块,然后在屏幕边缘的右侧立即绘制该屏幕最左侧的方块。然后,当相机延伸超过网格边界时,将相机的 x 值减去(或者,如果您向左,则添加)100。这将是无缝的,您将获得您想要的效果——除非我遗漏了什么,在这种情况下告诉我。

另一种选择是将生命游戏渲染为纹理,并将该纹理(设置为沿两个轴重复)渲染到屏幕。这可能是一个更容易和更快的选择。只需将 rgb 数据写入缓冲区(字节数组,长度为 3*3*100*100)并将该字节数组映射到纹理。您可能会找到大量关于如何做到这一点的教程——包括关于它的 nehe.gamedev.com 遗留教程(顺便说一句,Nehe 是一个很棒的资源)。

如果您选择纹理方法,则也不需要任何相机数学运算。只需更改映射到四边形的纹理坐标,它就会自动换行。

【讨论】:

以上是关于如何使用 OpenGL 创建“无限”世界的主要内容,如果未能解决你的问题,请参考以下文章

使用c ++单击OpenGL窗口时如何获取世界坐标

如何随着无限图的增长不断产生Perlin噪声?

如何将 2D 世界转换为屏幕坐标 OpenGL

OpenGL:如何将世界坐标转换为屏幕坐标?

OpenGL:如何使用深度排序的顶点数组设计高效的渲染系统?

如何让纹理在 OpenGL 中工作?