I am messing up with stencil buffer. Is there a simple way to visualize the stencil buffer and debug? Like the image below showing GTA5’s stencil map. I saw it in this blog.
I am trying to implement my own deferred rendering pipeline. In the first pass, gBuffer pass, I use a FDepthStencil texture to store the depth and stencil. Then the following lightBuffer perform light calculation on each opaque object’s pixel. Finally, the stencil debug buffer simply output a color for the pixel passed stencil test.
It should work correctly but I just cannot make it right.
My attribute setting code on each buffer.
gBuffer
In gBuffer, I set every opaque object pixels’ stencil to 1, and set rest of the pixels to 0.
tmpnode.setAttrib(StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOZero,
StencilAttrib.SOReplace, StencilAttrib.SOReplace, 1, 0, 1))
lightBuffer
In lightBuffer, I let stencil value keep anyway.
tmpnode.setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne, ColorBlendAttrib.OOne))
tmpnode.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))
tmpnode.setAttrib(StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep,
StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, 1, 0))
stencil debug buffer
In stencil debug buffer, I render a full screen quad and perform a simple shader outputting red color.
tmpnode.setAttrib(StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep,
StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, 1, 0))
I expecting red color(shader output) on opaque object, and black color(clear color) on sky(where nothing in there). However, the final image is a totally red, no difference between opaque scene and sky. I am messing up with this, which step did I wrong?