2010-04-12 49 views
9

我需要3GS上的模板緩衝區來渲染平面陰影,而多邊形 偏移將不起作用,仍然存在z-fighting問題。所以我使用 模板緩衝區來使陰影正確,它適用於win32 gles2 模擬器,但不適用於iPhone。在給整個 場景添加了帖子效果之後。即使在win32 gles2模擬器上,模板緩衝區也不起作用。如何在OpenGL ES 2.0中使用模板緩衝區創建FBO?

我試着模板緩衝區附加到FBO,BUF,屏幕將變爲黑色 。這裏是我的代碼,

 
    glGenRenderbuffers(1, &dbo); // depth buffer 
    glBindRenderbuffer(GL_RENDERBUFFER, dbo); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, 
widthGL, heightGL); 

    glGenRenderbuffers(1, &sbo); // stencil buffer 
    glBindRenderbuffer(GL_RENDERBUFFER, sbo); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, widthGL, 
heightGL); 

    glGenFramebuffers(1, &fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_2D, tex, 0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 
GL_RENDERBUFFER, dbo); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, 
GL_RENDERBUFFER, sbo); // this make the whole screen black. 

的eglContext與STENCIL_SIZE = 8創建的,它的工作原理沒有RTT。

我試圖更改深度緩衝區和 模板緩衝區的RenderbufferStorage,但它們都不起作用。

有什麼我錯過了嗎?帶有 深度緩衝區的模板緩衝區包?在iOS(我找不到類似的東西... GL_DEPTH24_STENCIL8)

+0

你可以檢查從glCheckFramebufferStatus的返回值()獲取更多信息 – 2010-04-12 10:14:06

+0

完整無誤,無錯誤報告。 – Xiaobin 2010-04-12 10:49:40

+0

我發現在OpenGLES.framework中定義了GL_OES_packed_depth_stencil。但我並沒有在Win32 PVR OpenGLES2模擬器發現它:(我會盡量做到對設備工作的明天。 – Xiaobin 2010-04-12 15:39:52

回答

13

在OpenGL ES 2.0的,你必須創建渲染使用GL_DEPTH24_STENCIL8_OES組合深度和模板,然後將其連接到綁定的framebuffer既GL_DEPTH_ATTACHMENT和GL_STENCIL_ATTACHMENT。

glGenRenderbuffers(1, &depthStencilRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRenderbuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer); 
+2

這讓我不知道爲什麼他們甚至提供'GL_STENCIL_INDEX8'和'GL_STENCIL_INDEX8_OES'如果這些實際上是不落實不工作。 – bobobobo 2013-05-02 19:06:17

+3

感謝!但你從哪裏得到這個信息? – MatterGoal 2013-09-07 17:17:24

+0

@bobobobo他們可以工作,如果你不希望在同一時間使用深度/模板緩衝區 – heLomaN 2017-07-27 07:30:59

3

只是注意,如果您使用的GLKView,它很簡單,只要

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

,其中的觀點是:GLKView*