【问题标题】:android glsurfaceview stretch to fitandroid glsurfaceview 拉伸以适应
【发布时间】:2015-10-15 06:57:06
【问题描述】:

我正在使用 glsurfaceview 和它的渲染器将 GLES 显示到设备全屏。这按预期工作。

现在我想添加“缩放”输出大小的选项。我的意思是(例如)将 GLES 渲染到屏幕四分之一的视口,然后在显示时拉伸到全屏。这将允许较慢的着色器更快地渲染,并带有一点块状。

我目前可以通过改变 glViewPort 来缩小 GLES 的大小,并且它会呈现在屏幕的左下角。我怎样才能让这个下半部分伸展以填满整个屏幕?

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

经过多次反复试验和谷歌搜索后的解决方案。这是将四分之一大小的图像渲染到全屏。

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);

宾果游戏。更快的渲染(但 2x2 块状像素)输出。

希望能帮助其他人解决这个问题。

【问题讨论】:

    标签: android opengl-es glsurfaceview


    【解决方案1】:

    你的问题已经有了答案,但我会用一些链接详细说明。

    Surface 的大小与 View 的大小无关。如果它们不同,则显示硬件会在 Surface 到达显示器的途中对其进行缩放。这意味着您可以使用 setFixedSize() 调用为 Surface 设置任意大小,这可用于减少必须由 Canvas 或 GLES 更新的像素数。

    如果您使用 Canvas 在软件中绘图,它还可以让您避免重新缩放位图,因为您可以依赖 Surface 在每台设备上的大小相同。

    有一个关于该功能的official blog post,以及在Grafika (video here) 中的使用示例。

    【讨论】:

    • 有没有办法指定缩放算法?默认情况下,它似乎在拉伸时进行线性或双线性模糊。是否可以让拉伸不过滤,所以结果是方形像素?
    • 过滤由显示硬件决定,通常是双线性的。通过使 Surface 的大小与 View 的大小成比例,您可以获得 square 像素;请注意答案中链接的 Grafika 演示中使用的 Surface 的奇数尺寸。您可以通过使 Surface 与 View 大小相同并在 GLES 中执行“胖像素”操作来获得 sharp 像素——您无法控制显示缩放器。
    猜你喜欢
    • 2015-07-20
    • 2013-08-22
    • 1970-01-01
    • 2010-11-13
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2011-04-25
    相关资源
    最近更新 更多