Настройка буфера OpenGL ES 2.0

Я заметил, что если я привяжу свой буфер глубины перед буфером цвета, приложение будет работать так, как задумано:

glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);
glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

Однако последующая привязка буфера глубины не приводит к визуализации, даже моя настройка glClearColor игнорируется:

glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);

Я должен понять часть потока того, как работает OpenGL ES 2.0, тщательно изучив отдельные компоненты, но похоже, что это единственное, что все делают в своих учебниках / книгах, но не объясняет почему. Любые идеи? Это вообще проблема или возможно что-то не так в остальной части моей настройки? (в таком случае я включу весь код)

ИЗМЕНИТЬ

@cli_hlt - буфер глубины уже добавляется в фреймбуфер:

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer);

ИЗМЕНИТЬ

Граница глубины до:

введите описание изображения здесь введите описание изображения здесь

Граница глубины после:

введите описание изображения здесь


person Matisse VerDuyn    schedule 28.03.2012    source источник
comment
Проверьте ответ на этот вопрос: stackoverflow.com/questions/4361516/ - похоже, вам не хватает запроса размера буфера и его присоединения к буферу кадра.   -  person cli_hlt    schedule 28.03.2012
comment
Это будет позже; если бы его там не было, я бы не получил никакой пользы от буфера глубины, независимо от моего вопроса о последовательности заказов.   -  person Matisse VerDuyn    schedule 28.03.2012
comment
В порядке. _Sw и _sh правильные? Я спрашиваю, как и в ответе, опубликованном выше, плакат с ответами сделал это точно вторым способом, и когда ответ был принят, я предположил, что он работает.   -  person cli_hlt    schedule 28.03.2012
comment
Я считаю, что все необходимые компоненты для запуска приложения есть; единственное, что изменяется, - это порядок привязки буфера глубины и цвета к буферу рендеринга.   -  person Matisse VerDuyn    schedule 28.03.2012
comment
@MatisseVerDuyn Я полагаю, что сказать нам, что рендеринг является простым черным, было бы достаточно, чтобы прояснить проблему. Не нужно куча больших изображений. Но я буду судить об этом в пользу того, что вы пытаетесь дать хороший пояснительный вопрос.   -  person Christian Rau    schedule 28.03.2012
comment
@ChristianRau Спасибо за вашу любезность.   -  person Matisse VerDuyn    schedule 28.03.2012
comment
Я мало что знаю об OpenGL, но разве не привязка буфера рендеринга к буферу глубины некорректна? Привязка буфера рендеринга означает, что вы указываете, какой буфер рендерить глобально. В общем, старый заменяется новым. Цветовой буфер - это правильное место для рендеринга, поэтому, когда вы устанавливаете его последним, вы получаете правильный результат. Буфер глубины НЕ является местом для рендеринга, поэтому, когда вы устанавливаете его последним, вы получаете неверный результат (отображается только информация о глубине)   -  person borrrden    schedule 15.04.2012
comment
@borrrden, возможно, вы на правильном пути, поскольку второй glBindRenderbuffer (), кажется, перезаписывает первый. Однако я не думаю, что в этом проблема, поскольку они оба делают [аналогичный] вызов glRenderbufferStorage (), используя текущий буфер рендеринга (что означает, что порядок здесь не имеет значения). Я действительно думаю, что волшебство происходит в этих строках: glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh); и [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];, где порядок действительно имеет какое-то значение.   -  person Matisse VerDuyn    schedule 16.04.2012


Ответы (1)


Возможно, я полностью ошибаюсь - я просто сам разбираюсь в этом, но, насколько я понимаю, команды glBind только сообщают OpenGL, какой буфер рендеринга / текстуры / что угодно использовать для последующих функций. Это странная модель, если вы привыкли к объектно-ориентированному программированию. В стандартном установочном коде вы должны привязать созданный вами буфер к «слоту» GL_RENDERBUFFER, чтобы следующий вызов glRenderbufferStorage () или - [EAGLContext renderbufferStorage: fromDrawable:] знал, какой буфер использовать. Я думаю, проблема просто в том, что вы не привязываете активный GL_RENDERBUFFER обратно к своему цветовому буферу перед вызовом - [EAGLContext presentRenderBuffer:], так что вы фактически показываете буфер глубины. Добавление

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);

перед presentRenderBuffer: вызов должен исправить это. …Я думаю.

person davehayden    schedule 16.04.2012
comment
Я временно принимаю этот ответ, хотя я ищу более точный ответ от кого-то, кто является экспертом по OpenGL ES 2.0 и может точно объяснить, почему это работает именно так. - person Matisse VerDuyn; 17.04.2012
comment
Пожалуйста, дайте мне знать, если это на самом деле не решит вашу проблему, чтобы я мог разобраться в том, чего я не понимаю в OpenGL. Спасибо! - person davehayden; 18.04.2012
comment
Это действительно работает, и концепция вашего ответа кажется правильной. Однако, на мой взгляд, параметр internalformat по-прежнему остается черным ящиком. То, что происходит в glRenderbufferStorage(...), имеет значение, какой буфер привязан к рендеринговому буферу для последующих вызовов. Если порядок имеет значение, технически все, что выполняет буфер глубины, переопределяется с помощью glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);, что заставляет меня спрашивать, делает ли что-нибудь буфер глубины? На это не похоже ... поскольку пропуск этого раздела кода ничего не меняет в моем приложении. ржу не могу - person Matisse VerDuyn; 18.04.2012
comment
Да, вы правы: если вы никогда не вызываете glEnable (GL_DEPTH_TEST), GL все равно не касается этого буфера глубины, поэтому нет причин создавать буфер рендеринга глубины, выделять для него хранилище и прикреплять его к буферу кадра. Похоже, вы просто делаете все во фрагментном шейдере, а экстент вашей трехмерной геометрии представляет собой один квадрат ... Можно также просто отбросить все детали глубины. - person davehayden; 18.04.2012
comment
Ну ... вот в чем дело: я им пользуюсь. В более ранних итерациях я перемещал строго по одной вершине за раз. Это вызвало множество проблем при преобразовании в определенных направлениях (вершина была бы скрыта за вершинами выше и слева от нее, что делало преобразование в этом направлении бессмысленным. Чтобы исправить это, я добавил 0,001 к координате z преобразования vertex, чтобы он всегда оставался наверху.Программа работает так же, применяется проверка глубины. - person Matisse VerDuyn; 18.04.2012