【问题标题】:OpenGL - Render same size regardless of screen size / ratioOpenGL - 无论屏幕尺寸/比例如何,都渲染相同的尺寸
【发布时间】:2014-02-03 14:33:53
【问题描述】:

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

在横向模式下,这看起来很棒,但如果我切换到纵向,一切都会变得更大。我一直在阅读有关截锥体、变换和比例的内容,但我不确定这里到底适用于哪个。

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

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

【问题讨论】:

    标签: android opengl-es


    【解决方案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
    

    【讨论】:

    • 完美!非常感谢!结束了一天的巨大挫折!
    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多