【发布时间】:2011-11-16 21:03:09
【问题描述】:
我在 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];
}
返回自我;
draw 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);
并且每一帧我都会清除颜色和深度缓冲区。现在,我确实从仪器那里收到有关该绘制视图的“当前渲染缓冲区”行的消息,它说“OpenGL ES 执行了不必要的逻辑缓冲区存储操作。这通常是由于在渲染循环开始时未清除缓冲区并且未在渲染循环结束。如果您的应用程序在每帧开始时清除深度缓冲区,它应该在每帧结束时丢弃深度缓冲区。有关更多详细信息,请参阅 EXT_discard_framebuffer 扩展。现在我正在努力解决这个问题,但我找不到解决方案。我可能在纹理中很少有可能发生这种情况的地方。至少找出为什么 opengl 可能会变得混乱会很有帮助。
附:我确实在该视图中加载纹理并将它们设置在这样的引擎中。 engineTexture[index] = viewsTextureValueAt[index];这只是将 GLuint 从视图纹理指针设置为引擎纹理指针。我可以这样做吗?它有效,但我不知道是否是这种情况。即使我注释掉所有纹理用法,我也会收到错误。
【问题讨论】:
-
我尝试禁用所有纹理,删除所有纹理绑定并使代码无纹理,但问题仍然存在...我将所有组件设置为不同颜色,所以现在,我看到的不是按钮,而是彩色方块在错误的位置。虽然我必须说,有五个正方形,它们画得很好,但是当这个错误出现时,其中一个按钮就会被弄乱。
标签: iphone ios ipad opengl-es buffer