2011-08-31 21 views
2

我想在我的应用程序中实现一些基本的OpenGL,并且这样做时,我使用SDK附带的GLPaint示例作为跳转点。我的代码自行运行良好,但是一旦我将所有内容移至我的应用程序,相同的代码就会失败。当我调整大小时,OpenGL绘图搞砸了CAEAGLLayer

根据我的尝试,问题是(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); 

我试图在这里改变价值观,和其他地方的移动这些台词,但什么我已经试过了工作。任何人对我有任何建议?

回答

1

我发现CAEAGLLayer不开心,除非其bounds.width是8

+0

这是真实的(和一个错误)期间的iOS 4.3测试期间,但不再是真实的。 –

+0

@quixoto:我正在测试的iOS 4(非beta版)iOS 4.3在过去的2个小时里给我带来了麻烦,直到我重新排列了所有东西以保持CAEAGLLayer的宽度和高度为8的倍数。 – Anomie

3

多我有同样的问题,有一天,我想通了。在重新创建帧缓冲区之前,您需要使用新尺寸调用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与当前矩阵相乘。

+0

谢谢,这真的帮助我了! –

+0

真棒我一直在追逐这个好几天。 –

1

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