2011-10-05 67 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