Iphone 当我调整CaeAglayer的大小时,OpenGL绘图搞砸了

Iphone 当我调整CaeAglayer的大小时,OpenGL绘图搞砸了,iphone,ios,ipad,opengl-es,calayer,Iphone,Ios,Ipad,Opengl Es,Calayer,我正在尝试在我的应用程序中实现一些基本的OpenGL,在实现过程中,我使用了SDK附带的GLPaint示例作为起点。我的代码本身运行良好,但一旦我将所有内容转移到我的应用程序,同样的代码就会失败 根据我的尝试,问题在于:(1)在第一次绘制图元时,图元会被压扁,然后在绘制后续图元时浮动到屏幕顶部,或者(2)图元根本不会出现 我把范围缩小到我的应用程序要求调整CaeAglayer的大小。它位于UIScrollView中,可以随时移动和调整大小(挤压、拖动等),就像在GLPaint示例中一样,每次视图

我正在尝试在我的应用程序中实现一些基本的OpenGL,在实现过程中,我使用了SDK附带的GLPaint示例作为起点。我的代码本身运行良好,但一旦我将所有内容转移到我的应用程序,同样的代码就会失败

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

我把范围缩小到我的应用程序要求调整CaeAglayer的大小。它位于UIScrollView中,可以随时移动和调整大小(挤压、拖动等),就像在GLPaint示例中一样,每次视图调整大小时(通过LayoutSubView),我都会清除帧缓冲区并重新创建它,但这不起作用。(由于GLPaint示例从不调整大小,我怀疑示例代码的这一部分从未工作过,因为它从未需要过。)

仅当我将CaeAglayer设置为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);

我尝试过在这里更改值,并将这些行移到其他位置,但没有任何效果。有人对我有什么建议吗?

我发现Caeaglayer不快乐,除非它的
边界。宽度是8的倍数。

前几天我也遇到了同样的问题,我发现了它。在重新创建帧缓冲区之前,确实需要使用新的大小调用
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
与当前矩阵相乘。

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

即:


在iOS 4.3测试期间,这是真的(也是一个错误),但现在不再是真的了。@quixoto:我现在测试的iOS 4.3(非测试版)的iPhone 4在过去的两个小时里一直给我带来麻烦,直到我重新安排了一切,使CaeAglayer的宽度和高度保持在8的倍数。谢谢,这真的帮了我大忙!太棒了,我已经追了好几天了。
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);