[Graphics] Clipping & Culling & Stencil buffer

박민주·2022년 6월 19일
0

Computer Graphics

목록 보기
3/8
post-thumbnail

Clipping

응용프로그램에 의해 정의되는 클리핑 또는 관측 공간 안에 들어가는 기본 요소나 그 일부분을 결정하는 과정

  • 클리핑된 정점의 w 성분이 1이 아닌 경우 필요한 투시 계산 전에 수행됨
  • Clipping Window를 벗어나면 잘라주어야 하고, 이 window는 viewport라고도 함
  • 그려지는 순간에 어디 그려질지 결정되기 때문에, 그리는 순간 혹은 그리기 직전에 클리핑이 일어나야 함
  • 픽셀로 바뀐 rasterize 이후에 일어남
  • 어떤 부분이 보여질 것인지 정의하는 과정이기도 하고, 보이는 부분만 그리면 됨

어떻게 클리핑하는지?

1. Point clipping

  • 내가 그리려는 점이 Viewport 안에 있으면 그리고 없으면 그리지 않는 것
  • 월드좌표계 상에서의 좌표를 확인
  • 확인을 한다는 액션 자체는 쉬운데, 래스터라이즈 된 모든 점에 대해서 체크를 해야해서 비효율적

2. Line clipping

  • 기하학적 성질을 이용하여 선을 잘라내는 방식
  • 직선의 방정식을 통해 직선을 나타낸 다음 교점을 찾고, 교점에 따라 직선을 자름
  • 간단히 말해서 Point clipping과 비슷한데 창안에 있는 선은 유지하고, 창밖의 선은 잘라냄

3. Polygon clipping

  • 왼쪽, 오른쪽, 위, 아래 순서대로 잘라냄
  • Xmax, Ymax 가 있을 때 어떤 다각형의 한 점이 max보다 작으면 그리고, max보다 크면 해당 max까지만 그림

3D vs 2D clipping

  • 3차원 클리핑은 할 필요가 없음
    정면에서 보이는 삼각형의 면만 자르면 됨

OpenGL에서는 어떻게 Clipping이 이루어지는지?

  • normalized coordinate에서 발생해서 clipping coordinate라고도 불림
  • Viewport 설정을 통해 실제 화면으로 맵핑함

glViewport(x,y,w,h)

  • x,y는 시작 좌표이고, w,h는 너비, 높이임

Culling

Back-face culling

  • 보이지 않는 면을 그리지 않도록 없애는 것 (면이 있어야 하므로 primitive assembly 이후에 발생)
  • Fragment process의 마무리에서 발생하며, 삼각형 면은 Front face, Back face 둘 중 하나의 성질을 갖게 됨
  • Front face는 카메라를 바라보고 있는 면, Back face는 카메라를 등지고 있는 면
  • 한 면이 바라보는 방향 벡터가 있을 때 내 쪽을 바라보면 Front face, 나와 같은 방향을 바라보면 Back face
  • 이 때 사용되는 방향 벡터는 Surface normal vector라고 하고 삼각형의 수직벡터로 정하게 됨
  • 수직벡터는 삼각형의 두 엣지를 외적해서 구하는데, 외적하는 벡터의 순서가 바뀌면 반대 방향으로 노말벡터가 나오기 때문에 정점의 순서가 중요함
    삼각형이 앞면일 때 시계반대방향(CCW)로 나타내야 함

Stencil buffer

  • 스텐실은 도화지에 구멍을 뚫어놓고 그 부분만 색칠하는 것을 말한다.
  • 이전에 배웠던 Frame buffer, Depth buffer와 같이 또 하나의 버퍼임
  • 거울이나 포탈같은 거 표현할 때 많이 사용되는데, 여러 물체들 중 거울에 비치는 것만 그리고 나머지는 그리지 않도록 막을 때 사용할 수 있음

    (출처 - https://www.ronja-tutorials.com/post/022-stencil-buffers/)

OpenGL에서는 어떻게 Stencil buffer를 사용하는지?

glStencilFunc(GLenum func, Glint ref, GLuint mask)

  • func: GL_LEQUAL, GL_ALWAYS 등의 값으로 테스트 함수를 정의
  • ref: 테스트를 위한 참조 값
  • mask: ref와 stencil 에서 어떤 값을 사용할지 선택

glStencilMask(GLuint mask)

  • 실제로 stencil 기법을 쓸 것인지(1) 말 것인지(0)를 정함
  • 이 때 뎁스버퍼의 값을 바꿀 것인지에 대한 설정으로 glDepthMask()를 이용할 수 있고, 컬러마스크 이용을 위해 glColorMask()를 이용할 수도 있음

glStencilMaskSeparate(GLenum face, GLuint mask)

  • Face: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
  • 앞면만 바꿀 것인지, 뒷면만 바꿀 것인지에 대한 옵션 설정 가능

glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)

  • 스텐실 값을 어떻게 바꿀 것인지에 대한 액션을 정의
  • GL_KEEP(원래 값 사용), GL_ZERO(0으로 설정), GL_REPLACE(특정값으로 변경), GL_INCR(1 더하는 것), GL_INCR_WRAP, GL_DECR(1씩 빼는 것), GL_DECR_WRAP(음수방지), GL_INVERT(1은 0으로, 0을 1로 바꾸는 것)
  • sfail: glStencilFunc에서 ref값이 펑션을 만족시키면 성공인데 그렇지 않은 경우
  • dpfail: stencil test는 패스했으나, depth test는 fail
  • dppss: stencil test, depth test 모두 성공

glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)

  • 앞면과 뒷면에 대해 함수를 다르게 설정할 수 있음

PER-FRAGMENT PIPELINE

Input: Fragment + Associated Data
1. Pixel Ownership Test:
색깔이 화면에 그려질 것인지 아닌지를 결정
2. Scissor Test: 잘라낼 부분들을 잘라냄
3. Alpha Test: 투명한 것인지 불투명한 것인지
4. Stencil Test
5. Depth Test
6. Blending
7. Dithering
8. Logic Op
Output: Frame buffer로

profile
Game Programmer

1개의 댓글

comment-user-thumbnail
2023년 11월 13일

Enjoy the energy of street art from the comfort of your device at https://www.grafftergallery.com/. Graffter Gallery's virtual space invites you to discover the bold colors and innovative styles of urban creativity. Click your way through an engaging collection that brings the streets to life on your screen.

답글 달기