android - OpenGL - 无论屏幕尺寸/比例如何,都呈现相同的尺寸

标签 android opengl-es

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

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

在横向模式下这看起来不错,但如果我切换到纵向模式,一切都会变得更大。我一直在阅读关于平截头体、变换和缩放的内容,但我不确定究竟哪些适用于此。

据我了解,视锥体是正确的,因为范围应该是 -ratio - ratio 和 1 - 1。

这样对吗?如果是这样,我应该使用缩放或变换来使图 block 和其他元素以相同的物理尺寸呈现,而不管方向如何?

最佳答案

例如,假设您的屏幕是 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

关于android - OpenGL - 无论屏幕尺寸/比例如何,都呈现相同的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530034/

相关文章:

android - 每次我打开 Phonegap 应用程序时,它都会重新启动。有返回同一页面的建议吗?

android - 使用 setAdapter 后如何防止 ListView 滚动到顶部

android - C2D_MESSAGE权限错误?

java - 如何使用四元数控制相机

android - 仅定位市场中运行速度快的 Android 设备

iphone - OpenGL ES iPhone 中的橡皮擦

android - 从 android 帐户管理器 "add account"中删除我的应用程序

java - gradle 中的类(class)重复条目

opengl-es - 不带 ftransform() 的桌面 GLSL

android - 我的应用程序已成功安装到 Android 上,但加载后立即崩溃