【问题标题】:OpenGL drawing messed up when I resize CAEAGLLayer当我调整 CAEAGLLayer 的大小时,OpenGL 绘图搞砸了
【发布时间】:2011-11-07 19:47:23
【问题描述】:

我正在尝试在我的应用程序中实现一些基本的 OpenGL,在此过程中,我使用了 SDK 中包含的 GLPaint 示例作为起点。我的代码本身就可以正常工作,但是一旦我将所有内容移到我的应用程序中,相同的代码就会失败。

根据我的尝试,问题是(1)图元在第一次绘制时看起来被压扁,然后在绘制后续图元时浮动到屏幕顶部,或者(2)图元根本不出现.

我已将其范围缩小到我的应用程序需要调整 CAEAGLLayer 大小的事实。它在 UIScrollView 中,可以随时移动和调整大小(捏合、拖动等)。在 GLPaint 示例中,我吹掉帧缓冲区并在每次视图调整大小时重新创建它(通过 layoutSubviews),但这并不不工作。 (由于 GLPaint 示例从不调整大小,我怀疑这部分示例代码从来没有工作过,因为它从来不需要。)

仅当我将 CAEAGLLayer 设置为 1024 x 768 的恒定大小时,代码才能按预期工作:

self.layer.frame = CGRectMake(0, 0, 1024, 768);

一旦我将该行更改为:

self.layer.frame = self.bounds;

问题又回来了。我的 layoutSubviews 方法的其余部分如下所示:

[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];

if (needsClearView) {
    [self clearView];
    needsClearView = NO;
}

destroyFramebuffer 和 createFramebuffer 方法与 GLPaint 示例基本相同。唯一引用视图大小的其他代码是 initWithCoder 中的这些行:

glOrthof(0, self.bounds.size.width, 0, self.bounds.size.height, -1, 1);
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);

我已尝试更改此处的值,并将这些行移至其他位置,但我尝试过的任何方法都没有奏效。有人对我有什么建议吗?

【问题讨论】:

    标签: iphone ios ipad opengl-es calayer


    【解决方案1】:

    前几天我遇到了同样的问题,我想通了。在重新创建帧缓冲区之前,您确实需要使用新大小调用 glOrthof 和 glViewport。我在layoutSubviews 电话中做到了:

    -(void)layoutSubviews
    {
        [EAGLContext setCurrentContext:context];
    
        glMatrixMode(GL_PROJECTION);
        CGRect frame = self.bounds;
        CGFloat scaleFactor = self.contentScaleFactor;
        glLoadIdentity();
        glOrthof(0, frame.size.width * scaleFactor, 0, frame.size.height * scaleFactor, -1, 1);
        glViewport(0, 0, frame.size.width * scaleFactor, frame.size.height * scaleFactor);
        glMatrixMode(GL_MODELVIEW);    
    
        [self destroyFramebuffer];
        [self createFramebuffer];
    
        // Clear the framebuffer the first time it is allocated
        if (needsErase) {
            [self erase];
            needsErase = NO;
        }
    }
    

    确保首先调用glLoadIdentity,因为glOrthof 与当前矩阵相乘。

    【讨论】:

    • 谢谢,这真的帮了我大忙!
    • 太棒了,我已经追了好几天了。
    【解决方案2】:

    在 VC 中使用 PaintingView 并更改其框架时,我遇到了同样的问题。通过在更改框架之前在视图上应用 CGAffineTransform 来解决它。

    即:

    paintingView.transform = CGAffineTransformMakeScale(0.5, 0.5);
    paintingView.frame = CGRectMake(paintingView.frame.origin.x, paintingView.frame.origin.y, paintingView.frame.size.width/2, paintingView.frame.size.height/2);
    

    【讨论】:

      【解决方案3】:

      我发现 CAEAGLLayer 不高兴,除非它的 bounds.width 是 8 的倍数。

      【讨论】:

      • 这在 iOS 4.3 测试期间是正确的(也是一个错误),但现在不再正确了。
      • @quixoto:我现在正在测试的带有(非测试版)iOS 4.3 的 iPhone 4 在过去 2 个小时里一直给我带来麻烦,直到我重新安排所有东西以保持宽度和高度CAEAGLLayer 为 8 的倍数。
      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多