2012-02-23 104 views
2

我是新來的opengl,我努力讓stencilbuffer工作的一個簡單的情況; 我有兩個紋理,一個是位圖,一個是「掩膜」,我試圖從位圖中隱藏一些部分。OpenTK模板緩衝區

我似乎無法得到這個工作,當我嘗試使用GL.TexImage2D創建我的模具紋理時設置模板格式我得到一個無效的枚舉,並且當我嘗試將一個stencilextension附加到FramebufferTexture2D FBO我畫我的面具在:

GL.Enable(EnableCap.StencilTest); 
GL.ClearStencil(0); 
GL.StencilMask(0xFFFFFFFF); // read&write 

// Create stencil texture 
GL.GenTextures(1, out stencilTexture); 
GL.BindTexture(TextureTarget.Texture2D, stencilTexture); 
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, stencilTextureWidth, stencilTextureHeight, 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); 
//DOES NOT WORK: GL.TexImage2D(TextureTarget.Texture2D, 0, (PixelInternalFormat)All.StencilIndex, stencilTextureWidth, stencilTextureHeight, 0, OpenTK.Graphics.OpenGL.PixelFormat.StencilIndex, PixelType.UnsignedByte, IntPtr.Zero); 

CREATE COLORTEXTURE FROM BITMAP 

// Create a FBO and attach the stencil texture 
GL.Ext.GenFramebuffers(1, out fbo); 
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, fbo); 
GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, stencilTexture, 0); 
//DOES NOT WORK?: GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.StencilAttachmentExt, TextureTarget.Texture2D, stencilTexture, 0); 

DRAW SOME STUFF INTO THE STENCILTEXTURE TO FUNCTION AS A MASK 

GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.StencilBufferBit); 

DRAW COLOR TEXTURE 

GL.Enable(EnableCap.StencilTest); 
GL.ClearStencil(0); 
GL.ColorMask(false, false, false, false); 
GL.StencilFunc(StencilFunction.Always, 1, 1); 
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Replace); 

DRAW THE STENCIL TEXTURE 

GL.Disable(EnableCap.StencilTest); 

我似乎無法找到證明這一點的一個簡單的2D情況下(掩蔽使用紋理貼圖)的任何實例。

編輯: 更新版本在這裏:http://pastebin.com/iuur2UTM

+0

這是一個非常多的代碼。你能否讓問題更具體? – 2012-02-23 09:37:04

+0

對不起,我提供了整個示例,以便它可以運行,因爲我不確定問題出在哪裏......我編輯了原始帖子以僅包含相關部分,並鏈接了應該編譯的完整源代碼。 – Martijnh 2012-02-23 13:40:24

+1

爲什麼投下來,只是因爲他提供了很多代碼?在閱讀了很多問題後,很高興看到人們花時間和精力解決問題並提供他們所擁有的東西。找到一個合適的答案。我討厭添加一個評論,總是像「請張貼你的畫圖方法」等。這是defintely不是一個值得downvoting的問題。 – dowhilefor 2012-02-23 16:20:29

回答

1

不能渲染到FBO和期望模板操作工作除非你確實附上緩衝區蠟紙它。 FBO只有你給他們的緩衝區。

由於您使用的是FBO的EXT版本,因此您必須檢查是否存在EXT_packed_depth_stencil擴展名。如果這是有,那麼你可以做如下(注意:這是C.你必須把它翻譯成OpenTK和C#代碼):

GLuint renderBuffer; 
glGenRenderbuffers(1, &renderBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_EXT, stencilTextureWidth, stencilTextureHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER, renderBuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER, renderBuffer); 

這應該幫助。

+0

感謝您的回覆!不幸的是,我仍然無法實現它(我是一個opengl noob,似乎無法找到任何有關如何實現此目的的參考)。我將上面給出的代碼翻譯成opentk等效代碼: GL.GenRenderbuffers(1,out stencilTexture); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer,RenderbufferStorage.StencilIndex8Ext,stencilTextureWidth,stencilTextureHeight); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer,stencilTexture); 我在這裏粘貼了全部源代碼:http://pastebin.com/rPzKgvDj – Martijnh 2012-02-27 07:28:15

+0

@Martijnh:那不是我發佈的OpenTK等價物。當我告訴你使用GL_DEPTH24_STENCIL8時,你使用了StencilIndex8格式。您必須使用組合的深度和模板格式。此外,我發佈了一個明顯的錯誤,我現在已經糾正。 – 2012-02-27 08:05:04

+0

我改變了它,但它警告一個無效的操作:http://pastebin.com/iuur2UTM 這些是通過模板渲染緩衝區實現遮罩紋理的正確步驟嗎?: *使蠟紙能力 *創建渲染(與模板附件) *創建顏色紋理 *創建FBO和附加模板渲染和colortexture 在抽獎循環: *使模板 *清晰的模板 *繪製顏色紋理 * set stencil ops * draw stencil * disable stencil – Martijnh 2012-02-27 09:54:16