2010-08-18 4 views
1

Я пытаюсь заставить буфер глубины работать, поэтому я могу начать делать игру для iOS. Я в порядке с OpenGL и Objective-C для OSX, но это мой первый раз, когда я делаю приложение iphone.Использование буфера глубины в iOS с OpenGL ES 1.1

Я удалил классы ES1Renderer и ES2Renderer и переместил код ES1 в класс EAGLView. По умолчанию анимация работала, когда я это делал. Когда я попытался использовать перспективу, это пошло не так. Теперь я получаю белый экран. Может ли кто-нибудь сказать мне, что я делаю неправильно?

В методе инициализации:

// Create default framebuffer object. 
    glGenFramebuffersOES(1, &defaultFramebuffer); 
    glGenRenderbuffersOES(1, &colorRenderbuffer); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer); 
    //Initialisation code for the game's graphics and to develop the scene 
    glEnable(GL_DEPTH_TEST); //Enables Depth Testing 
    glDepthFunc(GL_LEQUAL); 
    glDepthMask(GL_TRUE); 
    //glEnable(GL_CULL_FACE); 
    //glCullFace(GL_FRONT); 
    //Setup projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double xmax = 0.04142135624 * ((float) backingWidth)/backingHeight; 
    glFrustumf(-xmax, xmax, -0.04142135624, 0.04142135624, 0.1, 2000); //The ymax and min have been precalculated 
    glMatrixMode(GL_MODELVIEW); //Select The Modelview Matrix 
    glLoadIdentity(); 

В методе drawView:

static const GLfloat squareVertices[] = { 
     1, 1,-0.1f, 
     -1, 1,-0.1f, 
     1, -1,0.1f, 
     -1, -1,0.1f, 
    }; 

    static const GLubyte squareColors[] = { 
     0,0,200,255, 
     40,90,250,255, 
     0,0,200,255, 
     50,100,230,255, 
    }; 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClear(GL_DEPTH_BUFFER_BIT); 
    glVertexPointer(3, GL_FLOAT, 0, squareVertices); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

В методе layoutSubviews:

// Allocate color buffer backing based on the current layer size 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*) self.layer]; 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 
    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; 
    [self drawView:nil]; 

Я сделал все это, кажется, я должен делать. Я не знаю, почему это намного сложнее для iOS.

Благодарим за помощь.

+0

Также меняется цвет очистки не работает. Он всегда белый. –

+0

Мне нужно было перестроить буфер цвета: glBindRenderbufferOES (GL_RENDERBUFFER_OES, colourRenderbuffer); Прозрачный цвет теперь работает, но рендеринг площади не сохраняется. –

ответ

0

Взгляните на код, который вы можете найти at this page автора inits подкласса EAGLView параметризующем метод в случае, если он нуждается в буфер глубины

+0

Спасибо. Я посмотрел и, похоже, настроил буфер глубины так же, как и мой. Я не могу запустить его, потому что он использует старый SDK. Как я могу изменить SDK на новый, чтобы я мог его запустить? Благодарим вас за ответ. –

+0

Отбросьте так много! В конце концов, я понял, как изменить SDK. У меня есть что-то сделать после того, как я скопировал код камеры и бит glPushMatrix(). Я не уверен, какой из них нужен. Я подозреваю, что это последнее.В обычном OpenGL вам нужно что-то показать без перевода матрицы, и glPushMatrix() никогда не требуется. Нигде не сказали, что это необходимо. Я просто рад, что что-то сделал. Я думаю, что я могу понять, что здесь происходит. Спасибо вам большое. –

+0

НЕ благодарите меня, спасибо, что блоггер ^^. BTW, для изменения SDK требуется Перейти к проекту> Изменить настройки проекта> Архитектуры> Базовый SDK – rano

0

я мог читать это неправильно, но вы определяете окно подрезки с:

glFrustumf(-xmax, xmax, -0.04142135624, 0.04142135624, 0.1, 2000); 

и объект, который вы пытаетесь сделать с:

static const GLfloat squareVertices[] = { 
     1, 1,-0.1f, 
     -1, 1,-0.1f, 
     1, -1,0.1f, 
     -1, -1,0.1f, 
    }; 

Наверху вас обрезают значения Z от 0,1 до 2000. Но ваши вершины имеют значения Z от -0,1 до 0,1. Они не видят, что они перекрываются.

Возможно, вы захотите переместить объект, который вы хотите, , чтобы посмотреть в область, где вы можете ее увидеть.

+0

Я пробовал перемещать все по всему месту. Я узнал, что забыл установить видовое окно, поэтому я попробую еще раз ... Он по-прежнему не работает, и у меня есть значения z в 10. У меня есть настройка видового экрана в части init непосредственно перед настройкой матрица проекции: glViewport (0, 0, backingWidth, backingHeight); Благодарим вас за ответ. –

Смежные вопросы