OpenGL中的缩放窗口

时间:2014-08-11 15:24:55

标签: c++ opengl

我使用OpenGL缓冲区实现了Game of Life(如此处指定的:http://www.glprogramming.com/red/chapter14.html#name20)。在此实现中,每个像素都是游戏中的一个单元格。

我的程序收到游戏的初始状态(2d数组)。在我的实现中,size数组是窗口的大小。这当然使它无法播放"如果数组是5x5或其他一些小值。

在每次迭代中,我都将帧缓冲区的内容读入2D数组(其大小是窗口大小):

glReadPixels(0, 0, win_x, win_y, GL_RGB, GL_UNSIGNED_BYTE, image);

然后,我正在做必要的步骤来计算活细胞和死细胞,然后绘制一个覆盖整个窗口的矩形,使用:

glRectf(0, 0, win_x, win_y);

我想缩放(或放大)窗口而不影响我的代码的正确性。如果我调整窗口大小,那么帧缓冲区内容将不适合内部图像(数组)。有没有办法缩放窗口(以便将每个像素绘制为几个像素)而不影响帧缓冲?

2 个答案:

答案 0 :(得分:0)

首先,你似乎在学习opengl 2,我建议改为学习更新版本,因为它更强大,更有效率。可以在http://www.opengl-tutorial.org/

找到一个好的教程

如果我理解正确,你会在初始状态下读取并绘制它,然后连续读取屏幕上的像素,根据生命逻辑游戏更新阵列然后将其拉回来?这似乎过于复杂。 屏幕上的像素读取是不必要的,如果您尝试将视图放大到一个像素以上,将会导致复杂化。 我想说一个好的解决方案是保持一个位数组(1是有机体,0不是),可能作为内存中的2d数组,每次更新30次迭代(30 fps),然后绘制所有的rects在屏幕上,黑色为1,白色为0,使用glColor(r,g,b,a)绑定到嵌套for循环中的in语句。 然后,如果你给你的rects一个负z坐标,你可以使用键盘按钮触发的glTranslate(x,y,z)“放大”。

当然,在较新版本的opengl中,顶点缓冲区可以使代码更加清晰和高效。

答案 1 :(得分:0)

您不能将游戏状态直接存储在窗口帧缓冲区中,然后调整其大小以进行渲染,因为存储在帧缓冲区中的内容根据定义即将渲染。 (你可以覆盖它,但是你会失去游戏状态......)最简单的解决方案就是将游戏状态存储在一个数组中(在客户端),然后根据它更新纹理。因此,对于设置的每个块,您可以将纹理中的像素设置为适当的颜色。然后,每个帧渲染一个具有该纹理的全屏四边形(使用GL_NEAREST过滤)。

但是,如果你想利用你的GPU,有一些技巧可以通过使用片段着色器来生成纹理,从而大大加快模拟速度。在这种情况下,你实际上有两个纹理在你之间乒乓:一个包含当前游戏状态,另一个包含下一个游戏状态。您将使用片段着色器(以及FBO)从当前状态纹理生成下一个状态纹理的每个帧。然后,交换两个纹理,使下一个状态成为当前状态。然后,当前状态纹理将以与上面相同的方式呈现到屏幕。

我试图概述一下如何将计算卸载到GPU上,但是如果我不清楚任何地方就会问!有关更详细的解释,请随意提出另一个问题。