힘들다. 원리에 대해서 설명한 글은 솔직히......잘 없는 것 같아 정리하고자 한다.
Fragment in OGL :
after the rasterization stage (including texturing), the data are not yet pixel, but are fragments.
Fragment is all the data associated with a pixel, including coordinate, color, depth and texture coordinates.
(rasterization 단계(텍스쳐 포함)후, 데이터들은 아직 픽셀이라고 말할 수는 없다. fragment이다. fragment는 좌표, 색상, 깊이, 텍스쳐 좌표 정보를 포함한 픽셀과 연관된 모든 데이터를 말한다.(당연히, 그 단계를 거쳤으므로))
Fragment는 픽셀이 되기 전, Scissor Test, Alpha Tes 등의 단계를 각각 거쳐서 픽셀로서의 가치를 인정받게 되는데, 우리는 아래에 나타날 두 가지 함수를 통해 Stencil Test시에 어떠한 테스트를 할 것(glStencilFunc)이며, 또한 그 테스트 결과를 토대로 스텐실 버퍼에 어떤 동작을 가할 것인지를 결정(glStencilOp)하게 되는 것이다. (기본 값으로는 아무 것도 하지 않도록 되어 있음)
참고 :
How Many Buffers Are There?
In OpenGL:
- Color buffers: front, back, front-left, front-right, back-left, back-right and other auxiliaries
- Depth buffer
- Stencil buffer
- Accumulation buffer
Exactly how many bits are there in each buffer, depends on
- OGL implementation
- what you choose
Each buffer can be individually cleared
각 테스트는 어떠한 일을 하는가? (glEnable로 on/off)
–scissor test - an additional clipping test
–alpha test - a filtering test based on alpha
–stencil test - a pixel mask test : 스텐실 테스트는 스텐실 버퍼의 값을 데이터로 하여 그리는 작업을 컨트롤 할 때 쓰인다. -> 스텐실 테스트에 실패한 Fragments는 그려지지 않는다. ( <->통과 : 드로잉 됨)
–depth test - fragment occlusion test
The contents of the stencil buffer are used in conjunction with a reference value and a test function to control which pixels in the frame buffer are drawn.
Controlling Stencil Buffer
For each pixel, what do I do? Look:
glStencilFunc( func, ref, mask ) - determines what the stencil test does.
- used to set the stencil function and reference value. (스텐실 함수(func)와 참조 값(reference value)을 정하기 위해 쓰인다.)
- compare value in buffer with (ref AND mask) and (stencil_pixel AND mask) using func
(스텐실 함수(func)를 사용하는 ref AND mask)와 (stencil_pixel AND mask)를 거친 버퍼속의 값을 비교한다.)
- func is one of standard comparison functions
- For example, the following would only allow pixels to be drawn where there was a 1 in the low-bit of the corresponding value of the stencil buffer: glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp( fail, zfail, zpass ) -
determines what happens to the stencil buffer if the stencil test passes or fails.
- Allows changes in stencil buffer based on:
- Failing stencil test
- Failing depth test
- Passing depth test
- GL_KEEP, GL_INCR, GL_REPLACE, GL_DECR, GL_INVERT, GL_ZERO
- You can not write directly to the stencil buffer, but you can modify the stencil buffer as the side effect of each pixel passing or failing the stencil or z-buffer tests.
- The function glStencilOp(failop, zfailop, zpassop)is used to specify how and when to modify the stencil buffer.
if stencil test fails
use failop
else if zbuffer test fails
use zfailop
else
use zpassop
- For example, glStencilOp(GL KEEP, GL KEEP, GL REPLACE) tells OpenGL to leave the stencil buffer unmodified when either the stencil test or z-buffer test fails. When both tests pass, replace the correspnding stencil value with the reference value specified with glStencilFunc().
Creating a Mask
- Initialize Mask
glInitDisplayMode( …|GLUT_STENCIL|… ); //스텐실 버퍼 활성화
glEnable( GL_STENCIL_TEST ); //스텐실 테스트를 하겠다.
glClearStencil( 0x0 ); //스텐실 버퍼에 기본 값을 0으로 하겠다.
glStencilFunc( GL_ALWAYS, 0x1, 0x1 ); //
glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE ); //스텐실 버퍼의 값을 각 경우에 따라 어떻게 할 것인지 결정
Using Stencil Mask
draw objects where stencil = 1
glStencilFunc( GL_NOT_EQUAL, 0x1, 0x1 );
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
draw objects where stencil != 1
'dev, tech > opengl' 카테고리의 다른 글
mfc + opengl (0) | 2009.02.19 |
---|---|
opengl 연습하기 (0) | 2009.02.18 |
댓글