Поддерживает ли iOS5 и GL_STENCIL_INDEX, и GL_STENCIL_INDEX8? - PullRequest
1 голос
/ 16 ноября 2011

Со следующим кодом:

GLuint viewRenderbuffer, viewFramebuffer, viewDepthbuffer, stencilBuffer;
// Create the framebuffer object
glGenFramebuffers(1, &viewFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);

// Create a render buffer and bind it to the FBO.
glGenRenderbuffers(1, &viewRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &imageWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &imageHeight);

// Create a depth buffer and bind it to the FBO.
glGenRenderbuffers(1, &viewDepthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewDepthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, imageWidth, imageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, viewDepthbuffer);

// Create a stencil buffer to crop the rendered scene and bind it to the FBO.
glGenRenderbuffers(1, &stencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, stencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX, imageWidth, imageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilBuffer);

// Check the FBO.
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"Failure with framebuffer generation: %d", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}

С GL_STENCIL_INDEX я получаю ошибку GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT. С GL_STENCIL_INDEX8 я получаю ошибку GL_FRAMEBUFFER_UNSUPPORTED. Обе они вызваны последней функцией glFramebufferRenderbuffer (), которая должна связать буфер трафарета с FBO.

Кроме того, когда я проверяю значение GL_RENDERBUFFER_STENCIL_SIZE, я получаю правильное значение (8) с помощью GL_STENCIL_INDEX8, но я получаю 0 с помощью GL_STENCIL_INDEX.

С этим я не могу получить функциональное и полное FBO с трафаретным буфером. Это из-за GL_STENCIL_INDEX? Какой из них следует использовать здесь?

1 Ответ

3 голосов
/ 16 ноября 2011

Похоже, что в OpenGL ES 2.0, по крайней мере, на iOS (не уверен для других ОС), вам нужно создать объединение буфера глубины и буфера трафарета. Я перечислил все расширения, поддерживаемые на моем устройстве (iPhone 4 с iOS 5.0.1), и единственное, что связано с буфером трафарета:

GL_OES_packed_depth_stencil

Это говорит о том, что вам придется создать буфер глубины + трафарет (взят из книги по программированию iPhone 3D)

// Create a packed depth stencil buffer.
GLuint depthStencil;
glGenRenderbuffersOES(1, &depthStencil);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencil);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, width, height);

// Create the framebuffer object.
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
                             GL_RENDERBUFFER_OES, color);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
                                GL_RENDERBUFFER_OES, depthStencil);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES,
                             GL_RENDERBUFFER_OES, depthStencil);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, color);
...