繁体   English   中英

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

[英]GLKBaseEffect not loading texture (texture appears black on object)

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

直到现在一切都运转良好,但在一个新视图中,我正在创建一个需要带有纹理的矩形,以模拟用于我的应用程序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。

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

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

简单的教程http://games.ianterrell.com/how-to-texturize-objects-with-glkit/我认为它将为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM