我试图在我的应用程序中实现一些基本的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;
}
与GLPaint示例相比,destroyFramebuffer和createFramebuffer方法基本不变。引用视图大小的唯一其他代码是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);
我尝试过在此处更改值,并将这些行移动到其他位置,但是我尝试过的任何方法都没有用。有人对我有什么建议吗?
最佳答案
前几天,我遇到了同样的问题,我想出了办法。在重新创建帧缓冲区之前,您确实需要使用新的大小调用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
与当前矩阵相乘。关于iphone - 调整CAEAGLLayer大小时OpenGL绘图困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7260948/