2013-04-27 117 views
0

下面是一個基於Xcode 4.5中的OpenGL Game示例項目編寫的示例「GLKView子視圖」應用程序。它創建了其委託設置爲文件所有者的GLKViewController一個GLKView子視圖,這樣既OpenGL ES的2次由一個控制器控制:GLKView嵌套子視圖框架大小和邊界大小不正確

http://d-h.st/7R1

下面是截圖,我已經有色子視圖的背景紅色爲對比:

http://d-h.st/om4

我很興奮,我有一個簡單的方式來增加在多個GLKViews一個GLKViewController和EAGLContext(用於共享紋理等),直到我意識到幀大小在破:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    NSLog(@"My view frame: %@", NSStringFromCGRect(view.bounds)); 

    float aspect = fabsf(view.bounds.size.width/view.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 

    self.effect.transform.projectionMatrix = projectionMatrix; 

    GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); 
    baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); 

    // Compute the model view matrix for the object rendered with GLKit 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); 
    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); 

    self.effect.transform.modelviewMatrix = modelViewMatrix; 

    // Compute the model view matrix for the object rendered with ES2 
    modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); 
    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); 

    _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); 

    _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); 

    if(view == self.view) 
    { 
     glClearColor(0.65f, 0.65f, 1.0f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glBindVertexArrayOES(_vertexArray); 

     // Render the object with GLKit 
     [self.effect prepareToDraw]; 

     glDrawArrays(GL_TRIANGLES, 0, 36); 

     // Render the object again with ES2 
     glUseProgram(_program); 

     glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
     glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

     glDrawArrays(GL_TRIANGLES, 0, 36); 

     [self.subview display]; 
    } 
    else 
    { 
     glClearColor(1.0f, 0.65f, 0.65f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glBindVertexArrayOES(_vertexArray); 

     // Render the object with GLKit 
     [self.effect prepareToDraw]; 

     glDrawArrays(GL_TRIANGLES, 0, 36); 

     // Render the object again with ES2 
     glUseProgram(_program); 

     glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
     glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

     glDrawArrays(GL_TRIANGLES, 0, 36); 
    } 
} 

輸出在IOS模擬器與iPhone 4" 視網膜:

2013-04-27 15:50:56.149 GLKView Subview[48136:11903] My view frame: {{0, 0}, {568, 320}} 
2013-04-27 15:50:56.152 GLKView Subview[48136:11903] My view frame: {{0, 0}, {248, 100}} 

的子視圖的幀應該是{100,100},但由於某種原因它的未來出{248,100}。我試過了我能想到的所有東西,甚至將它嵌入到UIView中,認爲如果主GLKView是它的父代,它的autoresize約束可能會被設置錯誤。正如你所看到的UIView的大小是正確的,但孩子GLKView的大小是borked。作爲一名開發人員,這似乎是第一次嘗試,但蘋果通常還有其他想法。如果沒有自動調整大小,GLKView對任何設備大小的自由佈局都沒有用處。

我設法讓多個GLKViewControllers共享一個EAGLContext作爲不同項目中的子控制器。但我不明白爲什麼我們每次想要將GLKView添加到屏幕時都必須攜帶創建GLKViewController的行李。我的猜測是,當GLKViewController是一個GLKView的委託並不是它自己的視圖時,GLKViewController會感到困惑。

我還設法通過使用glViewport()手動獲取我的視圖,並且在失去兩天GLKView問題後,我可能會建議通過閱讀本文的路線(獲得跨平臺優勢)。

我希望有一個簡單的解釋/修復,即使它只是「你必須爲每個GLKView製作一個GLKViewController」。提前感謝任何設法使其工作的人。如果沒有,也許這個 錯誤 功能的例子將有助於某人。

回答

0

我找到了解決方法。只需使用示例項目,但關閉GLKView及其黑色父UIView的「自動調整大小」調整中最右邊的紅色條。

說明:由於從3.5英寸到4英寸的iPhone顯示屏的寬高比不同,自動調整大小會嘗試滿足右邊距約束條件,從而水平延伸視圖。通過告訴它維持左邊距和寬度,但不是右邊距,它會在主視圖中正確定位和調整視圖的大小。

儘管如此,一些靠不住的是怎麼回事,因爲如果你嵌入黑色的UIView內的另一個白色的UIView,並設置其所有的大小和保證金限制,其黑色父UIView的範圍內正確地自動調整大小,而GLKView未能做到所以如果你檢查所有的約束。 GLKView似乎仍然是針對根UIView進行自動調整,現在看來這是一個錯誤。它可能與將GLKView委託設置爲文件所有者有關。我已提交Apple Bug ID#13777142如果您希望提交自己的錯誤報告,則可以參考它。

P.S.如果我將每個GLKView嵌入到自己的GLKViewController中,例如the other posts on Stack Overflow say to do,我不會看到這些問題。