Настройка буфера OpenGL ES 2.0 - PullRequest
3 голосов
/ 28 марта 2012

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

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, благодаря тщательному изучению отдельных компонентов, но кажется, что это единственное, что все просто делают в своих уроках / книгах, но не объясняют Зачем. Есть идеи? Это даже проблема, или возможно что-то не так в остальной части моей установки? (если так, я включу весь код)

EDIT

@ 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);

EDIT

Глубина привязки до:

enter image description here enter image description here

Глубина привязки после:

enter image description here

1 Ответ

3 голосов
/ 16 апреля 2012

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

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);

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

...