2015-10-15 171 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