我正在将一个小型 iPad 应用程序从 OpenGL ES 2.0 迁移到 OpenGL ES 3.0。在应用程序中,我使用 的子类GLKView
来处理我的所有绘图,尽管我使用的唯一 GLKit 功能是:
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; // Or 2
self.drawableDepthFormat = GLKViewDrawableDepthFormatNone;
self.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
self.drawableMultisample = GLKViewDrawableMultisample4X;
self.drawableStencilFormat = GLKViewDrawableStencilFormatNone;
self.enableSetNeedsDisplay = YES;
// ... gl code following
我的-drawRect
方法如下所示:
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
[_currentProgram use]; // Use program
glUniformMatrix4fv([_currentProgram getUniformLocation:@"modelViewProjectionMatrix"], 1, 0, modelViewProjectionMatrix.m);
// ...
if (isES3) {
glBindVertexArray(vertexArray);
}
else {
glBindVertexArrayOES(vertexArray);
}
glDrawArrays(GL_TRIANGLE_STRIP, 0, verticiesLength);
我还没有支持 OpenGL ES 3.0 的设备,所以我所有的 OpenGL ES 3.0 测试都在 iOS 模拟器中完成。OpenGL ES 2.0 测试在设备上和模拟器中完成。
正如预期的那样,在 中ES2
,屏幕在启动时立即被清除为白色(-drawRect
已被调用一次,还没有要绘制的顶点)。但是,当我切换到ES3
时,上下文已成功创建,没有gl
调用失败,但屏幕并未按应有的方式清除 - 它只是显示为黑屏。寻找问题所在,我决定删除多重采样:
self.drawableMultisample = GLKViewDrawableMultisampleNone;
它奏效了!GLKit
(尽管没有抗锯齿。)因此,我的问题是,在 iOS 模拟器(iPad、iPad Retina 和 iPad Retina(64 位))中使用 OpenGL ES 3.0 进行多重采样是否存在任何已知问题?我的笔记本电脑有足够的可用内存来应对多重采样。