下面是一個基於Xcode 4.5中的OpenGL Game示例項目編寫的示例「GLKView子視圖」應用程序。它創建了其委託設置爲文件所有者的GLKViewController一個GLKView子視圖,這樣既OpenGL ES的2次由一個控制器控制:GLKView嵌套子視圖框架大小和邊界大小不正確
下面是截圖,我已經有色子視圖的背景紅色爲對比:
我很興奮,我有一個簡單的方式來增加在多個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」。提前感謝任何設法使其工作的人。如果沒有,也許這個
錯誤
功能的例子將有助於某人。