stencil buffer

Started by
4 comments, last by lomateron 11 years, 1 month ago

I am rendering to all the texels of a texture using a quad and I am rendering many instances(like 1000) of this quad to the same texture.

Every instance I render I will increase the alpha of each texel by 1(somethimes it will not, it depends on a operation inside the pixel shader), I want to stop rendering to a texel when the alpha value of this texel reaches a number.

I can't read the alpha value when rendering in this way to a texture, so I thought of moving the counter to a stencil buffer but I cant think of a way to configure the stencil so that it stops rendering to a texel when the stencil value of it reaches a number, lets say 255(that's the maximum number)

Can someone help me, is this possible?

Advertisement

You will need to do it in two passes. The first pass turn off writting to the frame buffer. Then set up your depth buffer to increment everytime you write a pixel to an location. Then on your second pass turn on writting to the frame buffer, and tell the stencil buffer to skip any pixel that is 255 or above.

how can I increment the depth value? the stencil value is the one I know to increment

This is the first time I'm using the stencil buffer.

I have a question, the two values that will go to the stencil function, one value comes from the value that the stencil buffer already has, where does the other comes?

The stencil takes a depth test pass and a depth test fail. You can tell it what you want it to do when either of those things happens. In your case you want to have the value increase when the depth test pass and have it do nothing when the depth test fails.

I will like to know the anwer to my last question, I think I can solve this if I know where the value comes from.

I know now,the other value comes from OMSetDepthStencilState() second parameter.

Now I know how to solve this:

the pixel shader will tell if I increase or not the stencil by using the SV_Depth value, if the depth value returned by the pixel shader is 1 it passes the depth test, if it isn't, it fails the depth test.

If it passes the depth test, I do the stencil test: If the stencil value is equal to "OMSetDepthStencilState() second parameter"(255 in this case) it fails the test if it isn't then I increase the stencil value by one.

that's all.

This topic is closed to new replies.

Advertisement