Использование буфера глубины в iPhone OpenGL ES 2.0
-
27-09-2019 - |
Вопрос
Я последовал за учебником, используя буфер глубины в OpenGL ES 1.1. Но я использую OpenGL ES 2.0. Реализованный код приводит к ошибке: не удалось сделать полный объект FrameBuffer 8CD6. См. Реализованный код ниже:
(void)createFramebuffer
{
if (context && !defaultFramebuffer)
{
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
// Create depth render buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
}
С уважением Ничелас
Решение
Проблема в том, что вы дважды связываете хранилище к вашей глубине RenderBuffer, а не на ваш цвет RenderBuffer. То -renderbufferStorage:fromDrawable:
Сообщение для вашего EAGLContext Стально хранилище на связанный в настоящее время RenderBuffer, который в вашем случае является глубиной RenderBuffer. Следующее, вы обязательно хранилище к нему, используя glRenderbufferStorage
вызов.
Решение состоит в том, чтобы связать цвет RenderBuffer перед отправкой сообщения хранения, чтобы хранилище было связано с этим. То есть вставьте строку glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
Непосредственно над сообщением, после того, как вы создадите свою глубину RenderBuffer. Он должен работать, я смог воспроизвести вашу ошибку и впоследствии решить ее таким образом.
Прис. Всегда убедитесь, что правильные буферы связаны. Вы можете проверить, используя glGetIntegerv()
для привязки и glGetRenderbufferParameteriv()
Для дополнительных параметров.