2012-02-23 12 views
2

私はopenglを初めて使いました。単純なケースではステンシルバッファを動作させるのに苦労しています。 私は2つのテクスチャを持っています.1つはビットマップで、もう1つは「マスク」で、ビットマップからいくつかの部分を隠そうとしています。OpenTKステンシルバッファ

GL.TexImage2Dを使用してステンシルテクスチャを作成する際にステンシルフォーマットを設定しようとすると、この機能が動作しないようですが、無効な列挙型を取得し、フレームバッファーテクスチャ2Dにstencilextensionをアタッチしようとすると私は(テクスチャを使用してテクスチャをマスキング)シンプルな2Dの場合のためにこれを示す任意の例を見つけることができないよう

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

:私は私のマスクを描くFBO。

編集:ここ 更新版:http://pastebin.com/iuur2UTM

+0

これはひどいコードです。問題をより具体的にすることはできますか? –

+0

申し訳ありませんが、問題がどこにあるのかわからないため、サンプルが完全に提供されています...オリジナルの投稿を編集して関連する部分のみを挿入し、コンパイルする完全なソースコードをリンクしました。 – Martijnh

+1

なぜ彼はたくさんのコードを提供したのでしょうか?ここで多くの質問を読んだら、人々が質問に時間と努力を払い、自分が持っているものを提供していることを知っておきましょう。適切な答えを見つける。私はいつも "あなたの描画方法を投稿してください"などのように読むコメントを追加することが嫌いこれはdefintely downvotingの価値がある質問ではありません。 – dowhilefor

答えて

1

あなたはFBOにレンダリングし、あなたが実際にそれにステンシルでバッファを添付ない限り、ステンシル操作が動作することを期待することはできません。 FBOには、与えたバッファしかありません。

FBOのEXTバージョンを使用しているので、EXT_packed_depth_stencil拡張の存在を確認する必要があります。それがあります場合は、次の(注:これはあなたがOpenTKとC#のコードにそれを翻訳する必要があります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

+0

@Martijnh:それは私が投稿したもののOpenTKに相当しません。 GL_DEPTH24_STENCIL8を使用するように指示したときに、StencilIndex8形式を使用しました。深度とステンシルの両方の形式を使用する必要があります。また、私が投稿したものは、私が今修正した明らかなバグを持っています。 –

+0

私はそれを変更しましたが、無効な操作について警告します:http://pastebin.com/iuur2UTM ステンシルレンダバッファでテクスチャをマスキングするための正しい手順はありますか?: * FBOを作成し、描画ループにステンシルレンダ&colortexture を添付*カラーテクスチャ を作成*(ステンシルの添付ファイル付き)レンダ を作成*ステンシル機能 を有効にします。 *ステンシル を有効*明確なステンシル *ドローカラーテクスチャ * set stencil ops *ステンシルを描く *ステンシルを無効にする – Martijnh

関連する問題