Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL中的缩放窗口_C++_Opengl - Fatal编程技术网

C++ OpenGL中的缩放窗口

C++ OpenGL中的缩放窗口,c++,opengl,C++,Opengl,我已经使用OpenGL缓冲区实现了人生游戏,如下所述:。在这个实现中,每个像素都是游戏中的一个单元 我的程序接收游戏2d数组的初始状态。在我的实现中,size数组是窗口的大小。当然,如果数组是5x5或其他一些小值,这会使其无法播放 在每次迭代中,我都将帧缓冲区的内容读取到一个2D数组中,其大小为窗口大小: glReadPixels(0, 0, win_x, win_y, GL_RGB, GL_UNSIGNED_BYTE, image); 然后,我正在执行必要的步骤来计算活细胞和死细胞,然后使用

我已经使用OpenGL缓冲区实现了人生游戏,如下所述:。在这个实现中,每个像素都是游戏中的一个单元

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

在每次迭代中,我都将帧缓冲区的内容读取到一个2D数组中,其大小为窗口大小:

glReadPixels(0, 0, win_x, win_y, GL_RGB, GL_UNSIGNED_BYTE, image);
然后,我正在执行必要的步骤来计算活细胞和死细胞,然后使用以下方法绘制一个覆盖整个窗口的矩形:

glRectf(0, 0, win_x, win_y);

我希望在不影响代码正确性的情况下缩放或放大窗口。如果调整窗口大小,则帧缓冲区内容将无法放入阵列中。是否有一种方法可以缩放窗口,以便在不影响帧缓冲区的情况下将每个像素绘制为多个像素?

首先,您似乎正在学习opengl 2,我建议您改为学习新版本,因为它更强大、更高效。在这里可以找到一个很好的教程

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


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

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

但是,如果您想利用GPU,有一些技巧可以通过使用片段着色器生成纹理来大幅加快模拟速度。在本例中,您实际上有两个纹理可以在其中进行乒乓:一个包含当前游戏状态,另一个包含下一个游戏状态。每个帧将使用片段着色器和FBO从当前状态纹理生成下一个状态纹理。之后,两个纹理交换,使下一个状态成为当前状态。然后,当前状态纹理将以与上面相同的方式渲染到屏幕上


我试着给你一个关于如何将计算卸载到GPU上的概述,但是如果我不清楚的话,那就问问吧!要获得更详细的解释,请随意提问。

谢谢您的回答,但这是一个课程项目。我必须以我所做的方式实施它。是否无法在不影响帧缓冲区或其他解决方案的情况下缩放窗口。。。?。我真的在这件事上发疯了。嗯……试着理解你到底想做什么。重新调整窗口大小还是缩放?如果要调整大小,可以使用函数调用将帧缓冲区重置为新大小。要缩放,帧缓冲区可以保持不变。假设你有一个10x10像素的窗口,所以有100个矩形。现在放大,使10x10窗口现在只显示25个矩形,每个矩形是2乘2。这只需要动态逻辑,在每个矩形采样中以x间隔仅采样一个像素,其中x是新的矩形宽度,偏移量为x,而不是在多次绘制时仅采样一个。如果这是作业,请将问题标记为作业。@ananthonline作业标记不推荐使用。