簡體   English   中英

使用OpenGL ES 3.0進行GLKit多重采樣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM