OpenGL ES 1.1 не будет рендерить текстуры? - PullRequest
0 голосов
/ 06 июня 2011

Правильно, я отправил похожий вопрос, я попытался полностью перестроить файлы, и сейчас происходит то, что текстуры вообще не отображаются.Изображение 512x512.По какой-то причине текстура работает на симуляторе, но не на моем iPod.

В классе с именем 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;
}

Мой метод рендеринга текстурированного квадрата:

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

Itвызывается, когда мой sceneObject отображается: (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();
}

И, наконец, мой класс Test: Awake вызывается при добавлении объекта в сцену

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

Спасибо, что нашли время, чтобы прочитать это и спасибо, если вы предлагаете какую-либо помощь =]

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Делаете ли вы какие-либо вызовы glTexParameter в любом месте, и вы создаете MIP-карты?Может случиться так, что графический процессор пробует карту, которую вы не предоставили.Что произойдет, если вы установите MIN_FILTER в значение GL_NEAREST или GL_LINEAR?

0 голосов
/ 12 июля 2011

Ответ оказался даже тем, что моя текстура называлась menuAtlas, как в боковом диспетчере файлов, так и в коде, он не будет работать, поэтому переход на mA сработал.Я не понимаю, почему, но у меня есть подозрение, что это связано с кэшированием.

...