2011-11-16 5 views
1

iOS5はGL_STENCIL_INDEXとGL_STENCIL_INDEX8の両方をサポートしていますか?次のコードで

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の値をチェックすると、GL_STENCIL_INDEX8で正しい値(8)が得られますが、GL_STENCIL_INDEXで0が得られます。

これで、ステンシルバッファを備えた機能的で完全なFBOを取得できません。 GL_STENCIL_INDEXが原因ですか?どちらを使うべきですか?

答えて

3

OpenGL ES 2.0では少なくともiOS(他のOSについてはわかりません)では、深度バッファとステンシルバッファを組み合わせて作成する必要があります。 私は私のデバイスでサポートされるすべての拡張機能(iOSの5.0.1でiPhone 4を)]が表示され、ステンシルバッファに関連した唯一の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); 
私は以前、同じサンプルコードを試してみましたが、私は、OpenGL ES 2で動作するよう、私はすべての_OESサフィックスを削除...しかし
+0

として埋め込まれた深さ/ステンシルバッファは拡張である、私はGL_DEP TH24_STENCIL8_OES。このように動作します。おかげさまで、JimN氏に感謝します。 –

+1

「プラットフォームノート」の「iOS向けOpenGL ESプログラミングガイド」の「PowerVR SGXのリリースノートとベストプラクティス」というタイトルの下で、 iOS 4.0以降では、別のステンシルバッファはサポートされていません。深度/ステンシルバッファを組み合わせて使用​​してください。 " PowerVR MBXにも当てはまるのかどうかは分かりませんが、iPhone 3GはXcode 4.5以降でサポートされていないので、それは議論の対象です。 – bleater

関連する問題