Ios 使用OpenGL ES 3.0的GLKit多重采样

Ios 使用OpenGL ES 3.0的GLKit多重采样,ios,ipad,opengl-es,ios-simulator,opengl-es-3.0,Ios,Ipad,Opengl Es,Ios Simulator,Opengl Es 3.0,我正在将一个小型iPad应用程序从OpenGL ES 2.0迁移到OpenGL ES 3.0。在应用程序中,我使用GLKView的子类来处理我的所有绘图,尽管我使用的唯一GLKit功能是: self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; // Or 2 self.drawableDepthFormat = GLKViewDrawableDepthFormatNone; self.drawab

我正在将一个小型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模拟器中完成的。OpenGLES2.0测试是在设备和模拟器上进行的

正如所料,在
ES2
中,屏幕在启动时立即被清除为白色(
-drawRect
已被调用一次,但尚未绘制顶点)。但是,当我切换到
ES3
时,成功创建了上下文,没有
gl
调用失败,但屏幕并没有像它应该的那样清晰-它只是显示为一个黑屏。仔细研究出了什么问题,我决定取消多重采样:

self.drawableMultisample = GLKViewDrawableMultisampleNone;

成功了!因此,我的问题是,iOS模拟器(iPad、iPad视网膜和iPad视网膜(64位))中使用OpenGL ES 3.0进行的
GLKit
多重采样是否存在任何已知问题?我的笔记本电脑有足够的空闲内存来处理多重采样。

OpenGL是一个非常异步的API。例如,如果调用
glClear
,则不应期望在调用返回时清除屏幕。只能可靠地查看在完成渲染帧后生成的渲染结果,并显示该结果(通常在使用双缓冲渲染时通过交换缓冲区)

所以你所观察到的很可能并不意味着什么。在画面的最后,一切看起来都好吗?如果是,没有理由担心


如果启用了多重采样,则差异可能是在不同的渲染过程中造成的。在这种情况下,渲染首先进入一个更高分辨率的缓冲区,并且只在帧结束时向下采样到实际的帧缓冲区。

部署时,从General>Deployment Info菜单中选择设备类型为iPad,而不是universal,这将解决此问题。

我想,自从我写下此答案以来,这个问题改变了一两次。不确定它是否仍然在目标上。最初听起来好像海报在清除调用后立即查看渲染,但现在听起来不同了。您在模拟器中运行的是哪个版本的iOS?我在使用iOS 7.0.4的真实iPad mini retina硬件上观察到了相同的行为(启用多重采样时出现黑屏)。我想知道这是否是一个在iOS的后期版本中修复的错误。我很高兴有人发现了这个问题!我相信是7.1(.0)。我已经更新了Xcode,并没有重新确认7.1.1中仍然存在这个问题。