GLKBaseEffect没有加载纹理(纹理在对象上显示为黑色)

时间:2012-09-02 13:22:36

标签: ios opengl-es textures glkit glktextureloader

我在OpenGL项目中使用GLKit。一切都基于GLKView和GLKBaseEffect(没有自定义着色器)。在我的项目中,我有几个视图,其中有GLKViews用于显示3D对象,偶尔这些视图中的一些可以一次“打开”(即在模态视图堆栈中)。

到目前为止,一切都运行良好,在我创建的新视图中我需要一个带纹理的矩形来模拟我的应用程序的3D世界的卷尺。由于某些未知原因,仅在该视图中,纹理未直接加载到opengl上下文中:纹理由GLKTextureLoader直接加载,但是当绘制矩形为黑色,并且在调试中查看OpenGL帧时,我可以看到加载一个空纹理(有一个对纹理的引用,但它全部归零或为null)。

我正在绘制的形状由以下定义:(它原本是一个三角形条,但我切换三角形以确保它不是问题)

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。

2 个答案:

答案 0 :(得分:3)

经过很多天我终于发现了我的错误 - 当使用多个openGL上下文时,使用shareGroup创建GLKTextureLoader很重要,否则纹理不一定会加载到正确的上下文中。

不是使用类方法textureWithContentOf,而是每个上下文都需要它自己的使用context.sharegroup初始化的GLKTextureLoader,并且只对该视图使用该纹理加载器。 (实际上纹理可以在不同的上下文之间保存,但我不需要共享组的那个功能)。

答案 1 :(得分:0)

简易教程http://games.ianterrell.com/how-to-texturize-objects-with-glkit/ 我认为它会对你有帮助。