[英]GLKit Multi-sampling with 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 Simulator中完成。 OpenGL ES 2.0測試是在設備上和模擬器中完成的。
如預期的那樣,在ES2
,啟動后屏幕立即清除為白色( -drawRect
被調用一次,並且尚未繪制任何頂點)。 但是,當我進行到ES3
的交換時,成功創建了上下文,沒有gl
調用失敗,但是屏幕並沒有按照應有的方式清除-它只是顯示為黑屏。 釣魚出什么問題了,我決定刪除多重采樣:
self.drawableMultisample = GLKViewDrawableMultisampleNone;
而且有效! (盡管沒有抗鋸齒。)因此,我的問題是,iOS模擬器(iPad,iPad Retina和iPad Retina(64位))中使用GLKit
和OpenGL ES 3.0進行多重采樣是否存在任何已知問題? 我的筆記本電腦有足夠的可用內存來應付多重采樣。
OpenGL是一個非常異步的API。 例如,如果調用glClear
,則不應期望在調用返回時清除屏幕。 您只能在完成渲染幀之后可靠地查看生成的渲染結果,並顯示出來(通常在使用雙緩沖渲染時通過交換緩沖區)。
因此,您最有可能觀察到的內容沒有任何意義。 框架結尾處的一切看起來都很好嗎? 如果是,則沒有理由擔心。
如果啟用了多重采樣,則差異可能是在不同的渲染過程中引起的。 在這種情況下,渲染首先進入更高分辨率的緩沖區,並且僅在幀末尾被下采樣到實際的幀緩沖區。
部署時,從“常規”>“部署信息”菜單中將設備類型選擇為iPad,而不是通用設備,即可對其進行修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.