2011-06-05 159 views
0

对,我发布了一个类似的问题,我试图完全重建文件,现在发生的是纹理根本不渲染。图像是512x512。出于某种原因,纹理可以在模拟器上运行,但不能运行在iPod上。OpenGL ES 1.1不会渲染纹理?

在一个名为EAGLView的类中,有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 Render方法

-(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(); 
} 

而且最后我的测试类:当对象被添加到场景

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

感谢您抽出宝贵的时间,如果你提供任何帮助,阅读此,感谢 清醒称为=]

+0

请参阅http://stackoverflow.com/questions/6239374/why-will-my-opengl-es-textures-not-render-properly(我不完全确定差异,太长的帖子)。 – 2011-07-11 21:14:13

回答

0

答案竟然是即使我的纹理被称为menuAtlas无论在文件管理器在侧面和代码它不会工作,所以改变这两个mA工作。我不明白为什么,但我怀疑它涉及与缓存有关的事情。

1

你在任何地方拨打任何电话给glTexParameter,并且您是否正在创建mip地图?它可能就是GPU正在抽取一个你没有提供的地图。如果将MIN_FILTER设置为GL_NEAREST或GL_LINEAR,会发生什么情况?

+0

不,我目前没有使用mip映射。 (我不知道现在怎么样了,但是我可能会设置MIN_FILTER并没有帮助,但在其他情况下可能会出现这种情况吗?我不知道。我发现代码适用于我想要做的事情,问题是我的图片文件被称为MenuAtlas.png和我的信息存储在menuAtlas.plist我调用它的方式使用菜单,而不是菜单,(我意识到这一点后,说iPhone是区分大小写)我改变了这仍然没有工作。但后来改为全mA(所以它代表同样的事情),它的工作!我没有第一个想法,为什么虽然。 – MPainter 2011-06-06 16:23:59

+0

哦,好吧,我很高兴它的工作!在未来,不设置MIN_FILTER将离开它的默认值是NEAREST_MIPMAP_LINEAR,所以如果你没有提供mip地图(无论手动还是自动),那么当你的几何变得足够小以至于它不想使用全尺寸图像时,它会显示其中一个较小的那些,但它们都是空白的,所以纹理应该是空白的区域。这是我经常惊慌失措的错误。 – Tommy 2011-06-06 16:50:47

+0

Awsome,抱歉,如此缓慢的回应,我可以看到,在未来为我节省一些问题:)感谢您的帮助 – MPainter 2011-06-24 20:35:56