1

我正在将一个小型 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 进行多重采样是否存在任何已知问题?我的笔记本电脑有足够的可用内存来应对多重采样。

4

2 回答 2

0

部署时,从“常规”>“部署信息”菜单中选择设备类型为 iPad,而不是通用,这将修复它。

于 2014-06-05T17:28:59.140 回答
0

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

所以你观察到的很可能并不意味着什么。帧结束时一切看起来都很好吗?如果是,就没有理由担心。

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

于 2014-04-27T03:16:13.457 回答