GLKit使用OpenGL ES 3.0进行多次采样

时间:2014-04-27 02:42:28

标签: ios ipad opengl-es ios-simulator opengl-es-3.0

我正在将一个小型iPad应用程序从OpenGL ES 2.0迁移到OpenGL ES 3.0。在App中,我使用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;

它有效! (虽然没有抗锯齿。)因此,我的问题是,在iOS模拟器(iPad,iPad Retina和iPad Retina(64位))中使用OpenGL ES 3.0进行GLKit多次采样有任何已知问题吗?我的笔记本电脑有足够的可用内存来应对多次采样。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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