【问题标题】:OpenGL ES 1.1 wont render textures?OpenGL ES 1.1 不会渲染纹理?
【发布时间】:2011-06-05 22:28:45
【问题描述】:

是的,我发布了一个类似的问题,我尝试完全重建文件,现在发生的情况是纹理根本没有渲染。图像为 512x512。由于某种原因,纹理适用于模拟器,但不适用于我的 iPod。

在名为 EAGLView 的类中有 b​​eginDraw 和 finishDraw,它们在我的游戏循环开始和结束时被调用。创建视图时会调用布局子视图。

-(void)beginDraw
{
    // Make sure that you are drawing to the current context
    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    // make sure we are in model matrix mode and clear the frame
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);
    // set a clean transform
    glLoadIdentity();   
}

-(void)finishDraw
{
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];  
}

- (void)layoutSubviews 
{
    [EAGLContext setCurrentContext:context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self setupViewLandscape];
}

- (BOOL)createFramebuffer {    
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER) {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }

    return YES;
}

我的 texturedQuad 渲染方法是

-(void)render
{
    glVertexPointer(vertexSize, GL_FLOAT, 0, vertexes);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(colorSize, GL_FLOAT, 0, colors); 
    glEnableClientState(GL_COLOR_ARRAY);    

    if (materialKey != nil) {
        [[MaterialController sharedMaterialController] bindMaterial:materialKey];

        glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
        glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);
    } 
    //render
    glDrawArrays(renderStyle, 0, vertexCount);  
}

这里还有 bindMaterial 方法:

-(void)bindMaterial:(NSString*)materialKey 
{
    NSNumber *numberObj = [materialLibrary objectForKey:materialKey];
    if (numberObj == nil) return;
    GLuint textureID = [numberObj unsignedIntValue];

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureID);
}

在渲染我的场景对象时调用它: (TexturedQuad 是网格的子类)

-(void)render
{
    if (!mesh || !active) return; // if we do not have a mesh, no need to render
    // clear the matrix
    glPushMatrix();
    glLoadIdentity();
    glMultMatrixf(matrix);
    [mesh render];  
    glPopMatrix();
}

最后是我的测试课: 将对象添加到场景时调用 Awake

-(void)awake
{
    self.mesh = [[MaterialController sharedMaterialController] quadFromAtlasKey:@"boxNotSelected"];
    self.scale = BBPointMake(50.0, 50.0, 1.0);
}

感谢您抽出宝贵时间阅读本文,如果您提供任何帮助,则表示感谢 =]

【问题讨论】:

标签: iphone ios opengl-es render


【解决方案1】:

您是否在任何地方对 glTexParameter 进行任何调用,并且您是否在创建 mip 映射?可能只是 GPU 正在对您未提供的地图进行采样。如果将 MIN_FILTER 设置为 GL_NEAREST 或 GL_LINEAR 会发生什么?

【讨论】:

  • 不,我目前没有使用 mip 映射。 (我还不知道怎么做,但我可能会设置 MIN_FILTER 没有帮助,但在其他情况下可能没有帮助?我不知道。我发现代码适用于我想做的事情,问题是我的图片文件被称为 MenuAtlas.png 并且我的信息存储在 menuAtlas.plist 中,我称之为使用菜单而不是菜单的方式,(我在阅读后意识到这一点说 iPhone 区分大小写)。我改变了这个仍然没有工作。但后来全部改为 mA(所以它代表相同的东西)并且它起作用了!我不知道为什么。
  • 哦,好吧,我很高兴它有效!对于未来,不设置 MIN_FILTER 会将其保留为默认值 NEAREST_MIPMAP_LINEAR。因此,如果您没有提供 mip 贴图(无论是手动还是自动),那么当您的几何体变得足够小以至于它不想使用完整尺寸的图像时,它将显示较小的一个,但它们是全部空白,因此您的纹理应该是空白的区域。这是我经常犯的错误。
  • 太棒了,很抱歉这么慢的反应,我可以看到将来可以为我节省一些问题 :) 感谢您的帮助
【解决方案2】:

答案结果是,即使我的纹理在侧面的文件管理器和代码中都被称为 menuAtlas,但它不起作用,因此将两者都更改为 mA 有效。我不明白为什么,但我怀疑它与缓存有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多