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

Ios GLKBaseEffect未加载纹理(纹理在对象上显示为黑色),ios,opengl-es,textures,glkit,glktextureloader,Ios,Opengl Es,Textures,Glkit,Glktextureloader,我正在OpenGL项目中使用GLKit。所有内容都基于GLKView和GLKBaseEffect(无自定义着色器)。在我的项目中,我有几个视图具有用于显示3D对象的GLKViews,偶尔其中几个视图可以一次“打开”(即在模式视图堆栈中) 虽然到目前为止一切都很顺利,但在我正在创建的一个新视图中,我需要一个带纹理的矩形来模拟我应用程序3D世界的卷尺。出于某种未知的原因,仅在该视图中,纹理没有正确加载到opengl上下文中:纹理是由GLKTextureLoader直接加载的,但是当绘制矩形时是黑色的

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

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

我正在绘制的形状定义如下:(它最初是一个三角形条带,但我切换为三角形以确保它不是问题所在)

我将效果变量设置为:

    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);
我还用其他对象在另一个视图中测试了纹理本身,效果很好,所以这不是纹理文件的错误

任何帮助都将不胜感激,因为我在这个问题上已经坚持了三天多了

更新:另外,在渲染循环期间没有任何错误。

简易教程 我想它会对你有所帮助。

简易教程
我想这会对你有所帮助。

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


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

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


与使用类方法textureWithContentOf不同,每个上下文都需要自己的GLKTextureLoader,该GLKTextureLoader由context.sharegroup初始化,并且仅对该视图使用该纹理加载器。(实际上,纹理可以在不同的上下文之间保存,但我不需要sharegroups的这一功能)。

谢谢,但几个月前我已经阅读了本教程(以及许多其他教程)。这并不是说我不能让纹理正常工作——我的大多数应用程序都工作得很好——而是因为某种原因,这个特定的视图不能正常工作,我也不知道为什么——这基本上和我到目前为止做的一样,在过去也能正常工作。纹理的大小是多少?你确定你的tapeTex不是零吗?512x512,tapeTex不是零。我也在其他对象的其他视图中检查了相同的纹理,效果很好。活动图形上下文的数量可能有限制吗?谢谢,但几个月前我已经看过了这个(和许多其他)教程。这并不是说我不能让纹理正常工作——我的大多数应用程序都工作得很好——而是因为某种原因,这个特定的视图不能正常工作,我也不知道为什么——这基本上和我到目前为止做的一样,在过去也能正常工作。纹理的大小是多少?你确定你的tapeTex不是零吗?512x512,tapeTex不是零。我也在其他对象的其他视图中检查了相同的纹理,效果很好。活动图形上下文的数量是否可能有限制?我可以在我的问题中添加其他内容来帮助人们回答吗?我可以在我的问题中添加其他内容来帮助人们回答吗?
       [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);