OpenGL 2D双缓冲缩放

时间:2014-02-08 12:16:54

标签: opengl opengl-es glfw

我正在使用OpenGL进行基于2D的游戏,该游戏的分辨率为640x480像素。因此,我设置了我的OpenGL双缓冲区:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, 0, 1);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

这非常有效,我可以使用硬件加速GL纹理绘制所有精灵和背景滚动条。现在我也想支持其他窗口大小,即用户应该能够以800x600,1024x768等运行游戏。所以所有图形都应该缩放到新的分辨率。当然,我可以通过在将纹理绘制为四边形时简单地将缩放因子应用于我的所有顶点来实现。但我不认为我能够以这种方式实现像素完美定位......但像素完美定位当然对2D游戏非常重要!

因此,我想询问是否有可能使用静态640x480双缓冲区,只有在它被绘制到屏幕之前才缩放,即类似这样的东西:

1)无论实际输出窗口大小是多少,我的双缓冲区总是640x480像素。

2)一旦我调用glfwSwapBuffers(),640x480双缓冲区应缩放到实际窗口大小,可以小于或大于640x480。

这有可能吗?我认为这对我的游戏来说是最简单的解决方案,因为手动缩放所有顶点可能会给我带来一些像素完美定位的问题,不是吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

我像这样设置我的OpenGL双缓冲:

我想你不知道“doublebuffer”是什么意思。这意味着您在不可见的缓冲区上执行绘制,然后在绘制完成后向用户显示,这样用户就不会看到绘图过程。

您在那里的代码片段是投影设置。并且以像素为单位对尺寸进行硬编码是错误的。

  

但像素完美定位当然对2D游戏非常重要!

不,不是真的。而不是“像素”单位(除了纹理图像索引和视口之外,OpenGL中并不存在),你应该使用像世界单位这样的东西。例如,在一个简单的跳转和运行平台游戏,如SMW

Super Mario World screenshot

你可以说,每个街区都是一个单位高。 Yosi-sprite高2个单位,马里奥1.5等等。

重要的是,您可以保持精灵渲染尺寸与屏幕分辨率无关。对于所有不同的屏幕分辨率和宽高比,这一点尤其重要。不要强迫用户使用您认为适合的分辨率。人们拥有大屏幕的电脑,他们想要使用它们。

精灵的外观在很大程度上取决于您使用的纹理图像和过滤方法。如果你想要实现像素化的外观,只需使纹理图像分辨率较低并使用GL_NEAREST放大滤镜,OpenGL将完成剩下的工作(但是你应该提供缩小mipmap并使用GL_LINEAR_MIPMAP_LINEAR进行缩小,这样事情看起来不太糟糕小决议)。

  

因此,我想询问是否有可能使用静态640x480双缓冲区,只有在它被绘制到屏幕之前才缩放,即类似这样的东西:

是的,您可以使用帧缓冲对象。创建一组渲染尺寸(如640×480)渲染的纹理(颜色和深度模板),然后在完成时将颜色纹理绘制到主框架缓冲区上填充四边形的视口中。

答案 1 :(得分:0)

和以前一样,渲染为640x480但渲染到屏幕外纹理。然后使用此纹理渲染屏幕大小(800x600,1024x768,...)四边形。