OpenGL - 无论屏幕大小/比例如何,都呈现相同的大小

时间:2014-02-03 14:33:53

标签: android opengl-es

我在OpenGL(Android)中渲染2D平面平铺表面,我使用以下方法设置视口:

float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, MIN_ZOOM + 1.0f);

在横向模式下,这看起来很棒但是如果我切换到肖像,一切都会变得更大。我一直在阅读关于平截头体和变换和尺度的内容,但我不确定哪些适用于此处。

据我所知,截头体是正确的,因为范围应该是 - 比率和1 - 1.

这是对的吗?如果是这样,我应该使用比例或变换来使瓷砖和其他元素以相同的物理尺寸渲染,而不考虑方向吗?

1 个答案:

答案 0 :(得分:1)

例如,假设您的屏幕是1200 x 800.在横向模式下,您将拥有:

ratio = 1.5
frustrum (left, right, bottom, top) = -1.5, 1.5, -1, 1

所以你的截头是3个单位宽,2个单位高。纵向:

ratio = 0.667
frustrum (left, right, bottom, top) = -0.667, 0.667, -1, 1

......现在宽1.333单位,高2单位。因此,尽管截头体在最短边和最长边之间的比例相同,但它在纵向上的比例较小,因此渲染看起来越来越近。你想要的肖像是:

frustrum = -1, 1, -1.5, 1.5

...因此,对于风景,最短的屏幕尺寸将是2个单位,最长的3个。检查比率是否大于1(以确定方向)并相应地设置截头体:

if (ratio >= 1.0f)
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, MIN_ZOOM + 1.0f); //Landscape
else
    gl.glFrustumf(-1, 1, -1/ratio, 1/ratio, 1, MIN_ZOOM + 1.0f); //Portrait