首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我调整CAEAGLLayer大小时,OpenGL绘图混乱

当我调整CAEAGLLayer大小时,OpenGL绘图混乱
EN

Stack Overflow用户
提问于 2011-09-01 01:27:59
回答 3查看 2.7K关注 0票数 2

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

根据我的尝试,问题要么是(1)基元在第一次绘制时出现挤压,然后在后续基元绘制时浮动到屏幕顶部,或者(2)基元根本不显示。

我已经缩小了范围,我的应用程序需要调整CAEAGLLayer的大小。它在UIScrollView中,可以随时移动和调整大小(收缩、拖动等)。与GLPaint示例一样,我清除了帧缓冲区,并在每次调整视图大小时重新创建它(通过layoutSubviews),但这不起作用。(由于GLPaint示例从不调整大小,因此我怀疑示例代码的这一部分从未工作过,因为它从来不需要这样做。)

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

代码语言:javascript
复制
self.layer.frame = CGRectMake(0, 0, 1024, 768);

一旦我将该行更改为:

代码语言:javascript
复制
self.layer.frame = self.bounds;

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

代码语言:javascript
复制
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];

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

与GLPaint示例相比,destroyFramebuffer和createFramebuffer方法基本保持不变。引用视图大小的唯一其他代码是initWithCoder中的以下行:

代码语言:javascript
复制
glOrthof(0, self.bounds.size.width, 0, self.bounds.size.height, -1, 1);
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);

我尝试在这里更改值,并将这些行移动到其他地方,但我尝试的都不起作用。有人对我有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2012-01-10 23:33:03

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

代码语言:javascript
复制
-(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与当前矩阵相乘。

票数 4
EN

Stack Overflow用户

发布于 2011-09-03 00:53:11

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

票数 1
EN

Stack Overflow用户

发布于 2013-12-16 10:02:49

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

即:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7260948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档