2017-01-03 3 views
2

Я пытаюсь получить значение глубины из буфера глубины с помощью функции glReadPixels. Мне всегда возвращается 0.glReadPixels не работает для получения глубины на OpenGL ES 1.0

первую очередь, создать глубину вложения буфера:

glGenFramebuffersOES(1, &viewFramebuffer); 
glGenRenderbuffersOES(1, &viewRenderbuffer); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

if (USE_DEPTH_BUFFER) 
{ 
    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); 
} 

тогда я называю glReadPixels функцию, чтобы получить значение глубины от буфера глубины:

float depth = 0.0f; 

glReadPixels(point.x, self.renderUIView.frame.size.height - point.y, 1, 1, GL_DEPTH_COMPONENT16_OES, GL_FLOAT, &depth); 

, но он не работает, в значение глубины всегда равно 0. Я пытаюсь получить код ошибки от glGetError(), он возвращает 1280. Я что-то пропустил для настройки?

+0

@RawN спасибо за ваш ответ, это то же самое между OpenGL ES 1.0 и OpenGL 2.0 в моей проблеме? –

+0

Боюсь, я этого не знаю. –

+0

@RawN ОК, Спасибо за ваш ответ. –

ответ

0

То, что вы пытаетесь, не поддерживается в OpenGL ES (любая версия API) - нет средств для использования glReadPixels на буферах глубины.

Также в целом обратите внимание, что использование glReadPixels для любой реальной 3D-игры как части вашего основного цикла рендеринга - это «действительно плохая идея» - это заставляет флеш-конвейер, который полностью уничтожит вашу производительность.

+0

спасибо за ваш ответ. BTW, как я могу получить значение буфера глубины в OpenGL ES 1.0? –

+0

С OpenGL ES 1.0 вам не повезло - нет способа делать то, что вы хотите. – solidpixel

+0

С OpenGL ES 2.0 и далее, если вы отвлекаете экран от FBO, тогда вы можете прочитать значение глубины в качестве текстуры во втором проходе визуализации и, например, используйте шейдер фрагмента, чтобы закодировать его в цветовой буфер RGBA, который вы можете называть «glReadPixels» (хотя он все равно будет убивать вашу производительность). Если вы визуализируете поверхность основного окна, а не на внешнюю поверхность, то вам не повезло, поскольку нет никаких средств для отображения буфера глубины поверхности окна в качестве текстуры. – solidpixel

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