У меня есть эта проблема с 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 на указатель текстуры движка.Могу ли я сделать это?Это работает, но я не знаю, так ли это.Я получаю ошибки, даже если я закомментирую все текстуры использования.
Спасибо за вашу помощь.