繁体   English   中英

OpenGL ES 1.1 不会渲染纹理?

[英]OpenGL ES 1.1 wont render textures?

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

在名为 EAGLView 的 class 中有 beginDraw 和 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();
}

最后我的测试 class: Awake 在 object 添加到场景时被调用

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

感谢您抽出宝贵时间阅读本文并感谢您提供任何帮助 =]

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

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

暂无
暂无

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

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