У меня проблема с чтением буфера глубины этапа рендеринга закадрового буфера кадра. При использовании OpenGL 4.5 он работает так, как задумано, но в OpenGL ES 2.0 (Angle) я получаю сообщение об ошибке при вызове glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthBuffer)
. Ошибка 0x502, это код ошибки GL_INVALID_OPERATION.
Еще немного предыстории. Я работаю в среде Qt, в которой есть основная процедура рендеринга, и теперь я занимаюсь неким закадровым рендерингом. Обычно мы используем настольную реализацию opengl, но на некоторых машинах у нас возникают проблемы с плохими версиями opengl. Поэтому я сейчас работаю над тем, чтобы сделать всю установку более надежной. Одна вещь, которую я сделал, - это вместо этого использовал угол. Итак, я просто пытаюсь получить работу под углом, который ДОЛЖЕН соответствовать использованию OpenGL ES 2.0.
Ну вот создание фреймбуфера:
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffers(1, &cboId);
glBindRenderbuffer(GL_RENDERBUFFER, cboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, cboId);
glGenRenderbuffers(1, &dboId);
glBindRenderbuffer(GL_RENDERBUFFER, dboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dboId);
Буфер кадра заполнен, и ошибок не возникает. Код между предыдущим и последующим заключительным фрагментом также не вызывает ошибок.
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, colorData);
//No error up to this point
glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthData));
//This call throws 0x502 (GL_INVALID_OPERATION)
Обычно я использую GL_DEPTH_COMPONENT24
, который по какой-то причине не работает. Поэтому вместо этого я использовал GL_DEPTH_COMPONENT16
. Может это намек на то, что не так. К вашему сведению, основной буфер кадра использует трафарет с глубиной 24 бита и трафаретом 8 бит. (Я пытался использовать формат GL_DEPTH24_STENCIL8
, но безуспешно при вызове glReadPixels).
Использование текстуры вместо этого или pbuffer не работает, потому что необходимые функции для этого обходного пути (glGetTexImage(...)
, glMapBuffer(...)
) не реализованы в версии GL, с которой я застрял.