OpenGL中的缩放窗口

Zoom window in OpenGL

本文关键字:窗口 缩放 OpenGL      更新时间:2023-10-16

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

我的程序接收游戏的初始状态(2d数组)。size数组,在我的实现中,是窗口的大小。如果数组是5x5或其他较小的值,这当然会使它"不可玩"。

在每次迭代中,我都将framebuffer的内容读取到一个2D数组中(其大小是窗口大小):

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

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

glRectf(0, 0, win_x, win_y);

我想在不影响代码正确性的情况下缩放(或放大)窗口。如果我调整窗口的大小,那么framebuffer内容将不适合图像(数组)。是否有一种方法可以在不影响framebuffer的情况下缩放窗口(以便将每个像素绘制为几个像素)?

首先,你似乎正在学习opengl 2,我建议你学习一个更新的版本,因为它更强大,更高效。一个很好的教程可以在这里找到http://www.opengl-tutorial.org/

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

当然,在较新的opengl版本中,顶点缓冲区将使代码更干净,更高效。

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

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

我试图给出一个概述,你如何能够卸载计算到GPU上,但如果我不清楚的地方,请问!