2012-09-02 103 views
0

我在OpenGL項目中使用GLKit。一切都基於GLKView和GLKBaseEffect(無自定義着色器)。在我的項目中,我有幾個GLKViews顯示3D對象的視圖,偶爾有幾個視圖可以一次「打開」(即處於模態視圖堆棧中)。GLKBaseEffect不加載紋理(紋理在對象上出現黑色)

雖然到現在爲止所有工作都很好,在創建新視圖時我需要一個帶紋理的矩形來模擬我的應用的3D世界的捲尺。由於某些未知的原因,僅在該視圖中,紋理不會直接加載到opengl上下文中:紋理由GLKTextureLoader正確加載,但在繪製矩形爲黑色並在調試中查看OpenGL框架時,可以看到一個空的紋理被加載(有一個對紋理的引用,但它全部歸零或爲空)。

形狀我畫的定義爲:(它本來是一個三角形帶,但我切換爲三角形,以確保它不是問題)

static const GLfloat initTape[] = { 
    -TAPE_WIDTH/2.0f, 0, 0, 
    TAPE_WIDTH/2.0f, 0, 0, 
    -TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 

    TAPE_WIDTH/2.0f, 0, 0, 
    TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 
    -TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 
}; 
static const GLfloat initTapeTex[] = { 
    0, 0, 
    1, 0, 
    0, 1.0, 

    1, 0, 
    1, 1, 
    0, 1, 
}; 

我設置的影響變量:

effect.transform.modelviewMatrix = modelview; 
    effect.light0.enabled = GL_FALSE; 

    // Projection setup 
    GLfloat ratio = self.view.bounds.size.width/self.view.bounds.size.height; 
    GLKMatrix4 projection = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(self.fov), ratio, 0.1f, 1000.0f); 
    effect.transform.projectionMatrix = projection; 


    // Set the color of the wireframe. 
    if (tapeTex == nil) { 
     NSError* error; 
     tapeTex = [GLKTextureLoader textureWithContentsOfFile:[[[NSBundle mainBundle] URLForResource:@"ruler_texture" withExtension:@"png"] path] options:nil error:&error]; 
    } 
    effect.texture2d0.enabled = GL_TRUE; 
    effect.texture2d0.target = GLKTextureTarget2D; 
    effect.texture2d0.envMode = GLKTextureEnvModeReplace; 
    effect.texture2d0.name = tapeTex.name; 

而渲染循環是:

 [effect prepareToDraw]; 
     glDisable(GL_DEPTH_TEST); 
     glDisable(GL_CULL_FACE); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
     glEnableVertexAttribArray(GLKVertexAttribPosition); 
     glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
     glVertexAttribPointer(GLKVertexAttribPosition, COORDS, GL_FLOAT, GL_FALSE, 0, tapeVerts); 
     glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, tapeTexCoord); 

     glDrawArrays(GL_TRIANGLES, 0, TAPE_VERTS); 

     glDisableVertexAttribArray(GLKVertexAttribPosition); 
     glDisableVertexAttribArray(GLKVertexAttribTexCoord0); 

我還測試了本身的質感在肛與其他對象的視圖,它工作正常,所以它不是紋理文件錯誤。

任何幫助將不勝感激,因爲我在這個問題上停留了3天以上。

更新:另外,渲染循環中沒有glErrors。

+0

還有什麼我可以添加到我的問題,以幫助人們回答它? –

回答

2

經過很多天,終於發現我的錯誤 - 使用多個openGL上下文時,使用shareGroup創建GLKTextureLoader非常重要,否則紋理不一定會加載到正確的上下文中。

而不是使用類方法textureWithContentOf,每個上下文都需要它自己的GLKTextureLoader,它使用context.sharegroup進行初始化,並且僅對該視圖使用該紋理加載器。 (實際上紋理可以保存在不同的上下文中,但我不需要共享組的特性)。

0
+0

謝謝,但幾個月前我已經閱讀了這個(以及其他許多)教程。這並不是說我的紋理一般都無法工作 - 我的大部分應用程序都工作得很好 - 就是因爲某種原因,這個特定的視圖沒有,我不明白爲什麼 - 它基本上是一樣的東西到目前爲止,我已經完成了這項工作,這在過去很有效 –

+0

什麼大小的紋理?你確定你的tapeTex不是零嗎? – SAKrisT

+0

512x512,tapeTex不是零。我也在其他對象的其他視圖中檢查了相同的紋理,並且它工作正常。是否有可能對活動圖形上下文的數量有限制? –