我在iPhone上使用openGL ES 1.1时遇到此问题。我已经制作了自己的c ++引擎,可以在opengl中完成所有工作,还有一个显示渲染内容的视图。问题是,有时它工作正常,有时(大多数时候)它显示混乱的视图。搞砸了我的意思是不移动的物体出现在不同的位置,旋转,拉伸,场景的其他部分是好的或不可见的,没有用户交互也没有FPS(当它分解时它只是一帧)。我想这可能是因为我的深度缓冲很糟糕。但我认为整体缓冲引擎可能不好。无论如何,这些是我的代码中的部分。
我有观点,初始化如下:
self = [super initWithFrame:frame];
if (self) {
CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
eaglLayer.opaque = YES;
m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
[self release];
return nil;
}
cplusplusEngine = CreateRenderer();
[m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];
cplusplusEngine ->Initialize(CGRectGetWidth(frame), CGRectGetHeight(frame));
//[self drawView: nil];
//m_timestamp = CACurrentMediaTime();
CADisplayLink* displayLink;
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[displayLink setFrameInterval:1/45];
[self loadUpTextures];
}
返回自我;
绘制View方法如下所示:
GLint a = cplusplusengine->Render();
[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
现在我创建缓冲区并呈现它,我也在引擎中创建缓冲区,如下所示:
int widthB, heightB;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_WIDTH_OES, &widthB);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_HEIGHT_OES, &heightB); glViewport(0, 0, widthB, heightB);
// Create a depth buffer that has the same size as the color buffer.
glGenRenderbuffersOES(1, &m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, widthB, heightB);
// Create the framebuffer object.
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,GL_RENDERBUFFER_OES,m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
每一帧我都会清除颜色和深度。现在我从绘图视图的行“present renderbuffer”获得了消息,它说“OpenGL ES执行了不必要的逻辑缓冲存储操作。这通常是由于在渲染循环开始时没有清除缓冲区而不丢弃缓冲区渲染循环的结束。如果你的应用程序在每帧开始时清除深度缓冲区,它应该在每帧结束时丢弃深度缓冲区。有关更多细节,请参阅EXT_discard_framebuffer扩展。“现在我正在努力解决这个问题,但我无法找到解决方案。我可能在纹理中很少有地方可能会发生这种情况。至少要找出为什么opengl会画得凌乱是有帮助的。
P.S。我在该视图中加载纹理并将它们设置在引擎中。 engineTexture [index] = viewsTextureValueAt [index];这只是将GLuint从视图纹理指针设置为引擎纹理指针。我能这样做吗?它有效,但我不知道是否是这种情况。即使我将所有纹理用法注释掉,我也会收到错误。
感谢您的帮助。
答案 0 :(得分:1)
我设法自己解决这个问题。看来我的缓冲区都没关系。我的纹理也很好。错误在于一个简单的“普通新手错误”。我使用了很少的变量来操纵和对齐我的所有场景。似乎当我在objective-c中使用那些变量而没有先将值定义为零时,没关系,编译器以某种方式为它们分配0,但是现在,当我使用c ++引擎时,我现在没有定义的所有变量都得到了随机值,这使我的应用程序以不同的方式随机崩溃。例如,我的按钮对齐阵列仅设置为最后4个按钮,第一个位于0位置,因此我将该数字保留为未定义,这就是为什么每次启动时该按钮都会飞离某处。有一次价值达到1700000+另一个-0.000056+等等。这是我的愚蠢错误。
感谢所有尝试在我的代码中发现错误的人。