2011-10-05 83 views
2

我正在用C++编写Android和iOS引擎,目前主要关注Android与NDK。如何自动缩放我的OpenGL ES 2.0窗口?

我想渲染到一个较小尺寸的视口(比如说600x360),并自动将其升级到原生rez(比如800x480)。目前,较小的视口显示在屏幕下方的黑色区域。

我的问题是我不知道一个简单的方法来做到这一点透明地使用NDK。在API级别11中有一个GLSurfaceview.setScaleX(和Y)函数,这将是完美的,但不存在于我所针对的API级别9中。另一个不好的解决方案是呈现给FBO,并将其作为最后一步呈现给屏幕。

我正在考虑简单的故事一个缩放矩阵,并要求引擎的用户(现在只是我)在绘制到屏幕时始终用顶点乘以顶点。这与使用glPushMatrix类似。

我搜索了一段时间,找不到一个好的解决方案。有谁知道如何提供帮助?

+0

您的缩放解决方案不会改变分辨率,它只是放大几何尺寸,然后以全分辨率呈现。这与完全不同于渲染小分辨率渲染图像。我不知道为什么FBO解决方案会是一个糟糕的解决方案,因为它是解决您的问题的完美方案。 –

+0

我可以测试它,但我关心性能。恐怕渲染到FBO然后复制它会在大多数设备上遇到填充率限制。 – nullspace

+0

您应该如何将低分辨率图像高分辨率转换为高分辨率图像。除插入低分辨率图像外没有其他方法,因此无论如何您都无法解决这个问题。 FBO是最快的解决方案,因为它可以防止不必要的副本。你不能仅仅通过神奇的方式将低分辨率的数据渲染到高分辨率的数据中,中间值(在低分辨率中缺失)应该具有什么颜色。你需要一些预存储然后插入。 –

回答

4

你可以做的是从得到SurfaceHolder GLSurfaceViewGLSurfaceView.getHolder()然后设置您可以通过调用SurfaceHolder.setFixedSize(width, height)希望的分辨率。

在我的情况下GLSurfaceView有的FrameLayout根填充屏幕,我不知道如果需要的话这就是 - 我有它,因为我在上面添加其他元素 - 但如果你设置的大小和它不填写屏幕上,然后你知道什么是缺失!

使用帧缓冲也是一种有效的方式,你可以借鉴它的一些很酷的效果为好,上面的方法就是更快,当你想要做的唯一事情是规模呈现下降(或可能吗?我没有尝试过)。

+0

这工作完美。非常感谢您填写答案,我搜索并找不到此解决方案。 – nullspace

+0

您必须非常熟悉Android界面,在观看Games/OpenGL | ES上的一个Google I/O演示时我偶然发现它 - 我想2010年的活动。 – MichalisB