2012-02-23 3 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 случая (маскирований текстур, используя текстуру).

EDIT: Обновленная версия здесь: http://pastebin.com/iuur2UTM

+0

Это очень много кода. Можете ли вы сделать проблему более конкретной? –

+0

Извините, я представил весь пример, чтобы он мог закончиться из коробки, так как я не уверен, где проблема ... Я редактировал исходное сообщение, чтобы включать только соответствующие части и связывать полный исходный код, который должен компилироваться , – Martijnh

+1

Зачем голосовать за него, просто потому, что он предоставил много кода? Прочитав здесь много вопросов, хорошо видеть, как люди уделяют время и силы своим вопросам и предоставляют то, что у них есть. Найти правильный ответ. Ненавижу добавить комментарий, который всегда читается как «пожалуйста, напишите свой метод рисования» и т. Д. Это не вопрос, стоящий на минусе. – dowhilefor

ответ

1

Вы не можете оказывать на FBO и ожидать трафарет операций работать если вы на самом деле прикрепить буфер трафарета к нему. У FBOs есть только те буферы, которые вы им даете.

Поскольку вы используете версию 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

+0

@Martijnh: Это не эквивалент OpenTK, который я опубликовал. Вы использовали формат StencilIndex8, когда я сказал вам использовать GL_DEPTH24_STENCIL8. Вы должны использовать комбинированный формат глубины и трафарета. Кроме того, у меня есть явная ошибка, которую я сейчас исправил. –

+0

Я изменил его, но он предупреждает о недопустимой операции: http://pastebin.com/iuur2UTM Являются ли эти правильные шаги для маскирования текстуры с помощью средства визуализации трафарета?: * включить возможность трафарет * создать renderbuffer (с вложениями трафарета) * создать цвет текстуры * создать FBO и прикрепить трафарет renderbuffer & colortexture в петле вытяжки: * включить трафарет * ясно трафарета * рисовать цвет текстуры * set stencil ops * нарисовать трафарет * отключить трафарет – Martijnh

Смежные вопросы