2012-09-02 67 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不是零。我也在其他对象的其他视图中检查了相同的纹理,并且它工作正常。是否有可能对活动图形上下文的数量有限制? –