2015-10-15 166 views
1

我正在使用glsurfaceview和它的渲染器來顯示GLES到設備的全屏。這按預期工作。android glsurfaceview stretch to fit

現在我想添加選項來「縮放」輸出尺寸。我的意思是(例如)將GLES渲染到屏幕四分之一的視口,然後在顯示時拉伸到全屏。這將使較慢的着色器渲染速度更快,並具有一點塊狀。

我目前可以縮小GLES大小,改變glViewPort並在屏幕的左下角呈現。我怎樣才能讓這個較低的季度延伸到填滿整個屏幕?

非常感謝任何提示/答案。

解決方案經過一些更多的試驗和錯誤和谷歌搜索。這是將四分之一大小的圖像渲染爲全屏。

在創建glsurfaceview之後;

glSurfaceView.getHolder().setFixedSize(glWidth,glHeight); 

glHeight和glWidth是內部GLES渲染大小。所以要渲染一個圖像1/4的屏幕使用glWidth = screenWidth/2和glHeight = screenHeight/2

然後在onSurfaceChanged中設置glViewPort;

glViewport(0, 0, screenWidth/2, screenHeight/2); 

賓果。更快的渲染(但2×2塊像素)輸出。

希望能幫助其他人解決此問題。

回答

0

你已經有你的問題的答案,但我會詳細說明一些鏈接。

Surface的大小與View的大小無關。如果它們不同,則顯示硬件會在Surface顯示屏上顯示時調整Surface的大小。這意味着您可以使用setFixedSize()調用爲Surface設置任意大小,這可用於減少Canvas或GLES必須更新的像素數。

如果您使用Canvas進行軟件繪製,它也可以讓您避免重新縮放位圖,因爲您可以依靠每個設備上的Surface大小相同。

有關於該功能的official blog post以及其在Grafikavideo here)中的使用示例。

+0

有沒有一種方法來指定縮放算法?默認情況下,它在伸展時似乎會執行線性或雙線性模糊。是否有可能有拉伸不過濾,所以結果是方形像素? – Some1Else

+0

過濾由顯示硬件決定,通常是雙線性的。通過使Surface的大小與View的大小成比例,可以得到* square *像素;注意答案中鏈接的Grafika演示中使用的Surface的奇數大小。通過使Surface與View的大小相同,並在GLES中執行「胖像素」操作,可以獲得* sharp *像素 - 您無法控制顯示縮放器。 – fadden