【问题标题】:Possible Retina issue with OpenGL ES on iPhone?iPhone 上的 OpenGL ES 可能存在 Retina 问题?
【发布时间】:2014-03-02 14:14:19
【问题描述】:

这可能与我的another unsolved mystery 相关。

我正在使用真实设备和模拟器在 iPhone 上绘制 Orthographic 2d。我正在尝试根据它们与我传入的“A”像素空间中任意点的距离(硬代码)将像素着色为给定的颜色。我在 Retina 960x640 分辨率下做所有事情。我计算从 A 到 gl_FragCoord 的距离,并根据 2 种颜色之间的跳跃进行着色,“最大”距离为 300 像素。

在模拟器上(带有视网膜显示)时,我需要为屏幕中点 X 提供“460”像素的中心点。Y 我给出 160 像素,并寻找“300”像素的距离......以获得 在设备上获得相同的效果 我需要 960X 的中心和 150 的距离才能获得相同的结果(有趣的是,px 80 并没有给出我想要的相同结果,但 160 可能是原始的超调...)

显然视网膜问题在起作用。但是在哪里、如何以及如何找到并修复它?

我正在使用:

glViewport(0, 0, 960.0f, 640.0f);

和:

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

还有:

[self setView:[[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds]];
[(EAGLView *)[self view] setContentScaleFactor:2.0f];

【问题讨论】:

    标签: ios opengl-es shader retina-display


    【解决方案1】:

    您不应该硬编码“glViewport(0, 0, 960.0f, 640.0f);”,这样设置视口:

    glViewport(0, 0, framebufferWidth, framebufferHeight);
    

    也不要硬编码内容比例,您可以通过以下方式找出内容比例:

    float contentScale = 1.0f;
    if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) {
        contentScale = [[UIScreen mainScreen] scale];
    }
    

    关于像素距离,由于您希望距离是视网膜显示的两倍,您可以使用内容比例向着色器添加一个制服。

    【讨论】:

    • 我已经用正确的通用值替换了那些 - 但是我通过硬编码非常清楚问题不存在。仔细查看我的 iPhone 4 设备上的 Q - Retina 显示屏和模拟器上的“retina”iPhone 设备的行为不同
    【解决方案2】:

    现在iOS设备可以有多个不同的屏幕,一个UIWindow可以放在一个非主屏幕上。在这种情况下,您可以使用self.view.window.screen.scale 动态获取当前屏幕的比例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2010-11-24
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多