2011-06-05 209 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