Hello,
I’ve managed to use the stencil buffer to create a simple reflection, however I’ve decided to use it for clipping my snow particle system within a globe. However, at certain viewing angles it doesn’t appear quite correct. As you can see in the video below, the snow lands as a square, but I don’t want this to be visible. Any ideas? Thanks!.
With a shader it would be simple: if the particle’s Y (relative to the grass plane) is 0.0f, set the particle’s alpha to 0 (alpha-test or blending required), or point_size=0.
With fixed-func, basically you want the particles to be hidden/discarded by the depth-buffer. Because there’s no way to hide with stencil tests only those that are both at 0.0f Y and outside the grass disc.
Before drawing all the stuff you already do, add this:
-
clear depth+color+stencil
-
set stencil to replace_always to 0x2
-
draw the podium
-
disable color-write, set stencil to keep_always, fail if stencil == 2
-
draw a box (6 quads) with sizes [radius4 : radius4 : 0.02f], centered on the podium. Its color won’t be visible, but it’ll set such depth, that later it will discard all geometry whose Y is -0.01f … 0.01f (relative to the podium). Those are the snowflakes you don’t want. Except, it won’t discard anything that’s with stencil-value 2 (the particles on the podium)
-
disable depth-testing, disable color-writing, set stencil to replace_always with 0x1
-
draw the globe, to which you limit snowflakes (as you already have done in that video)
-
enable color-writing, enable depth-testing, disable depth-writing, set stencil to keep_always, fail if stencil != 0x1
-
draw snowflakes
-
enable depth-writing, clear depth+stencil, disable color-writing, disable stencil
-
draw the podium again. (color-writing is still disabled, we’re just doing this for re-laying depth to a sane value, basically removing that box out of existence, as it’ll be troublesome later)
-
enable color-writing;
-
draw everything else (the globe’s glow etc) naturally now. (the Z-buffer has info that only the podium exists in the scene now, while the color-buffer shows the podium and nicely-clipped snowflakes on/above it)
Phew, seemed shorter when I imagined it.
Wow the fixed func way seems a bit tedious and a little confusing :P. I have some shaders already but they’re quite simple as I’m still very new to GLSL. I’m wanting the snow to land on the ground so setting the alpha value to 0 when hitting the ground would make it disappear altogether, which I don’t want. Is there a simpler way using a shader? If not I will have a go with fixed func.
Thanks
Bump
I’m wanting the snow to land on the ground and visible, so simply setting the alpha to be 0 in the shader isn’t ideal as this would make all snow disappear…
Re-read my post, as it’s that long in order to handle that case.