F.X*_*.X. 4 opengl-es ios opengl-es-2.0
我目前正在开发一款iPad应用程序,它使用OpenGL 在多个OpenGL视图中绘制一些非常简单(不超过1000或2000个顶点)的旋转模型.目前网格中有6个视图,每个视图都有自己的显示链接来更新绘图.由于模型的简单性,它是迄今为止最简单的方法,我没有时间编写完整的OpenGL接口.
目前,它在性能方面做得很好,但是有一些烦人的故障.前3个OpenGL视图显示没有问题,最后3个只显示几个三角形(同时仍保留旋转模型的能力).还有一些情况下glDrawArrays调用直接进入EXC_BAD_ACCESS(特别是在模拟器上),这告诉我缓冲区有问题.
我检查的内容(以及双重和三重检查)是:
我认为这可能与我同时绘制多个视图有关,那么我应该在那里做任何已知的事情吗?每个视图都有自己的上下文,但也许我做错了...
此外,我只是注意到在模拟器中,受影响的视图在右图与所有顶点之间闪烁,而错误的绘图只有少数几个.
无论如何,如果您有任何想法,谢谢分享!
好吧,我会回答我自己的问题,因为我终于找到了正在发生的事情.这是一个小缺失线,导致所有这些问题.
基本上,要同时显示多个OpenGL视图,您需要:
此外,在每帧之后调用glFlush(),告诉GPU完全渲染每一帧.
在我的情况下(第二个),渲染每个帧(在iOS中)的代码如下所示:
- (void) drawFrame:(CADisplayLink*)displayLink {
// Set current context, assuming _context
// is the class ivar for the OpenGL Context
[EAGLContext setCurrentContext:_context]
// Clear whatever you want
glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
// Do matrix stuff
...
glUniformMatrix4fv (...);
// Set your viewport
glViewport (0, 0, self.frame.size.width, self.frame.size.height);
// Bind object buffers
glBindBuffer (GL_ARRAY_BUFFER, _vertexBuffer);
glVertexAttribPointer (_glVertexPositionSlot, 3, ...);
// Draw elements
glDrawArrays (GL_TRIANGLES, 0, _currentVertexCount);
// Discard unneeded depth buffer
const GLenum discard[] = {GL_DEPTH_ATTACHMENT};
glDiscardFramebufferEXT (GL_FRAMEBUFFER, 1, discard);
// Present render buffer
[_context presentRenderbuffer:GL_RENDERBUFFER];
// Unbind and flush
glBindBuffer (GL_ARRAY_BUFFER, 0);
glFlush();
}
Run Code Online (Sandbox Code Playgroud)
编辑
我要编辑这个答案,因为我发现运行多个CADisplayLink可能会导致一些问题.您必须确保将CADisplayLink实例的frameInterval属性设置为0或1以外的值.否则,运行循环将只有时间调用第一个渲染方法,然后它将再次调用它.就我而言,这就是为什么只有一个物体在移动.现在,它被设置为3或4帧,并且运行循环有时间调用所有渲染方法.
这仅适用于在设备上运行的应用程序.模拟器非常快,不关心这些事情.
| 归档时间: |
|
| 查看次数: |
6202 次 |
| 最近记录: |