opengl 1.1 портится при запуске (случайно) - PullRequest
1 голос
/ 14 сентября 2011

У меня есть эта проблема с openGL ES 1.1 на iPhone.Я сделал себе движок c ++, который выполняет всю работу в opengl, и представление, отображающее визуализированный контент.Проблема в том, что иногда это работает нормально, а иногда (в большинстве случаев) это показывает испорченный вид.Под путаницей я подразумеваю, что объекты, которые не двигаются, появляются в разных местах, повернуты, растянуты, другие части сцены в порядке или невидимы, нет никакого взаимодействия с пользователем или FPS (это только один кадр, когда он разбивается).Я думал, что это может быть, потому что мой буфер глубины дерьмовый.Но я думаю, что общие буферные движки могут быть плохими.В любом случае это части из моего кода.

У меня есть представление, которое инициализируется следующим образом:

 self = [super initWithFrame:frame];
if (self) {
    CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
    eaglLayer.opaque = YES;


    m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

    if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
        [self release];
        return nil;
    }

    cplusplusEngine = CreateRenderer();

    [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];

    cplusplusEngine ->Initialize(CGRectGetWidth(frame), CGRectGetHeight(frame));

    //[self drawView: nil];
    //m_timestamp = CACurrentMediaTime();

    CADisplayLink* displayLink;
    displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView:)];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [displayLink setFrameInterval:1/45];

    [self loadUpTextures];

}

return self;

метод Draw View выглядит следующим образом:

GLint a = cplusplusengine->Render();

[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];

Теперь я создаю буфер и представляю его, я также создаю буферы в движке следующим образом:

 int widthB, heightB;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_WIDTH_OES, &widthB); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_HEIGHT_OES, &heightB); glViewport(0, 0, widthB, heightB);
// Create a depth buffer that has the same size as the color buffer.
glGenRenderbuffersOES(1, &m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, widthB, heightB);
// Create the framebuffer object. 
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,GL_RENDERBUFFER_OES,m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

И каждый кадр очищаю буферы цвета и глубины.Теперь я получаю сообщение от инструментов для строки этого текущего представления «текущий рендер-буфер», в котором говорится: «OpenGL ES выполнил ненужную операцию сохранения логического буфера. Обычно это происходит из-за того, что буферы не очищаются в начале цикла рендеринга и не удаляются буферы вконец цикла рендеринга. Если ваше приложение очищает буфер глубины в начале каждого кадра, он должен отбросить буфер глубины в конце каждого кадра. Дополнительные сведения см. в расширении EXT_discard_framebuffer. "Сейчас я пытаюсь решить эту проблему, но не могу найти решение.У меня может быть несколько мест в текстурах, где это может происходить.Было бы полезно по крайней мере выяснить, почему opengl может выглядеть грязно.

PS Я загружаю текстуры в этом виде и устанавливаю их в движке следующим образом.engineTexture [index] = viewsTextureValueAt [index];Это просто устанавливает GLuint из указателя текстуры views на указатель текстуры движка.Могу ли я сделать это?Это работает, но я не знаю, так ли это.Я получаю ошибки, даже если я закомментирую все текстуры использования.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 15 сентября 2011

Мне удалось решить это самому. Кажется, с моими буферами все в порядке. Мои текстуры тоже хороши. Ошибка заключалась в одной простой "обычной ошибке новичка". Я использовал довольно мало переменных, чтобы манипулировать и выравнивать всю мою сцену. Кажется, что когда я использовал эти переменные в target-c без предварительного определения значений на ноль, это было нормально, компилятор как-то присвоил им 0, но теперь, когда я использую движок c ++, все переменные, которые я не определил, теперь получают случайные значения, это делает мое приложение случайным сбоем по-разному. Например, мой массив выравнивания кнопок был установлен только для последних 4 кнопок, первая из которых находится в позиции 0, поэтому я оставил это число неопределенным, поэтому эта кнопка куда-то вылетала при каждом запуске. Один раз значение получилось 1700000+, другое -0.000056+ и так. Это была моя глупая ошибка.

Спасибо всем, кто пытался найти ошибки в моем коде.

...