오다기리 박의 알고리즘 노트

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 12. 프래그먼트 연산 본문

컴퓨터 그래픽스/OpenGL

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 12. 프래그먼트 연산

오다기리 박 2019. 2. 14. 21:18

OpenGL로 배우는 3차원 컴퓨터 그래픽스


Chapter 12. 프래그먼트 연산

Section 01. GL 파이프라인


Section 02. GL의 버퍼

  • 버퍼 활성화

    • void glutInitDisplayMode(int modes);

mode

활성화 버퍼

GLUT_SINGLE

Front 버퍼

GLUT_DOUBLE

Front 버퍼 + Back 버퍼

GLUT_DEPTH

Z 버퍼

GLUT_ACCUM

A 버퍼

GLUT_STENCIL

Stencil 버퍼

  • 버퍼 초기화 값 정의

    • glClearColor( ) : 프레임 버퍼(Front 버퍼, Back 버퍼, Auxiliary 버퍼)의 초기화 값 정의

    • glClearIndex( ) : Color Index 버퍼의 초기화 값 정의

    • glClearDepth( ) : Z 버퍼의 초기화 값 정의

    • glClearStencil( ) : Stencil 버퍼의 초기화 값 정의

    • glClearAccum( ) : A 버퍼의 초기화 값 정의

  • 정의된 초기화 값으로 버퍼 초기화

    • void glClear(GLbitfield mask);

mask

초기화 버퍼

GL_COLOR_BUFFER_BIT

프레임 버퍼(Front 버퍼, Back 버퍼, Auxiliary 버퍼)

GL_COLOR_DEPTH_BIT

Z 버퍼

GL_COLOR_STENCIL_BIT

Stencil 버퍼

GL_COLOR_ACCUM_BIT

A 버퍼

  • 버퍼에 어떤 내용 읽기 / 쓰기

    • void glDrawBuffer(GLenum mode);

    • void glReadBuffer(GLenum mode);

  • 버퍼에 마스킹 가하기

    • void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);

    • void glDepthMask(GLboolean flag);

    • void glStencilMask(GLUint mask);


Section 03. 프래그먼트 연산

  • Scissor Test(프레임 버퍼와 관련)

    • 뷰포트 내부에 시저박스를 설정하여 추가적인 절단을 수행하는 과정

    • void glEnable(GL_SCISSOR_TEST);
      void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
      void glDisable(GL_SCISSOR_TEST);

  • Alpha Test(Z 버퍼와 관련)

    • 알파 값을 기준으로 해당 프래그먼트를 제외시키는 작업

    • void glEnable(GL_ALPHA_TEST);
      void glAlphaFunc(GLenum func, GLclampf ref);

    • Transparency 알고리즘

      • Z 버퍼 활성화하고 알파가 1.0 인 것(3,4)을 그린다.

      • 프레임 버퍼에는 3이 기록된다.

      • Z 버퍼 비활성화하고 알파<=1.0 인 것(1,2)을 그린다.

      • depth 비교없이 1, 2의 컬러가 그대로 프레임 버퍼에 반영된다.

      • 1, 2, 3의 혼합 색이 보임으로써 투명 효과를 얻는다.

  • Stencil Test(A 버퍼와 관련)

    • 스텐실 버퍼에 저장된 임의의 모양을 기준으로 내외부에 그려지도록 국한시키는 작업

    • void glStencilFunc(GLenum func, GLUint ref, GLUint mask) : mask값이 1로 설정되어 있는 비트에 대해서만 ref와 스텐실 버퍼값이 비교됨.
      void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) : stencil test와 depth test를 통과하느냐 마느냐에 따라 스텐실 버퍼의 내용을 변경할 때 사용

  • Depth Test(스텐실 버퍼와 관련)

    • Z 버퍼 알고리즘이 가해지는 부분이다.

    • 시점에서 가까운 프래그먼트가 멀리 있는 프래그먼트를 가리게되어 가까운 프래그먼트의 깊이가 버퍼에 기록되는 과정

    • void glEnable(GL_DEPTH_TEST);
      void glDepthFunc(GLenum func);

  • Blending

    • 블렌딩 함수

      • glEnable(GL_BLEND);
        void glBlendFunc(GLenum sfactor, GLenum dfactor);

파라미터 상수

영향 받는 요소

혼합인수 값

GL_ZERO

Source / Destination

(0, 0, 0, 0)

GL_ONE

Source / Destination

(1, 1, 1, 1)

GL_DST_COLOR

Source

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><msub><mi>R</mi><mi>d</mi></msub><mo>,</mo><msub><mi>G</mi><mi>d</mi></msub><mo>,</mo><msub><mi>B</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub></mrow></mfenced></math>

GL_SRC_COLOR

Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><msub><mi>R</mi><mi>s</mi></msub><mo>,</mo><msub><mi>G</mi><mi>s</mi></msub><mo>,</mo><msub><mi>B</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub></mrow></mfenced></math>

GL_ONE_MINUS_DST_COLOR

Source

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn></mrow></mfenced><mo>-</mo><mfenced><mrow><msub><mi>R</mi><mi>d</mi></msub><mo>,</mo><msub><mi>G</mi><mi>d</mi></msub><mo>,</mo><msub><mi>B</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub></mrow></mfenced></math>

GL_ONE_MINUS_SRC_COLOR

Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn></mrow></mfenced><mo>-</mo><mfenced><mrow><msub><mi>R</mi><mi>s</mi></msub><mo>,</mo><msub><mi>G</mi><mi>s</mi></msub><mo>,</mo><msub><mi>B</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub></mrow></mfenced></math>

GL_SRC_ALPHA

Source / Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub></mrow></mfenced></math>

GL_ONE_MINUS_SRC_ALPHA

Source / Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn></mrow></mfenced><mo>-</mo><mfenced><mrow><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><msub><mi>A</mi><mi>s</mi></msub></mrow></mfenced></math>

GL_DST_ALPHA

Source / Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub></mrow></mfenced></math>

GL_ONE_MINUS_DST_ALPHA

Source / Destination

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn></mrow></mfenced><mo>-</mo><mfenced><mrow><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub><mo>,</mo><msub><mi>A</mi><mi>d</mi></msub></mrow></mfenced></math>

GL_SRC_ALPHA_SATURATE

Source

<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced><mrow><mi>f</mi><mo>,</mo><mi>f</mi><mo>,</mo><mi>f</mi><mo>,</mo><mn>1</mn></mrow></mfenced><mo>:</mo><mi>f</mi><mo>-</mo><mi>m</mi><mi>i</mi><mi>n</mi><mfenced><mrow><msub><mi>A</mi><mi>s</mi></msub><mo>,</mo><mo>&#xA0;</mo><mn>1</mn><mo>-</mo><msub><mi>A</mi><mi>d</mi></msub></mrow></mfenced></math>

      • 영상 합성(Image Composition)

    • 깊이 큐와 안개 효과

      • void glFog{if}[v](GLenum pname, TYPE param);

pname

param

의미

GL_FOG_MODE

GL_EXP, GL_EXP2, GL_LINEAR

안개함수

GL_FOG_DENSITY

density

안개함수의 밀도 값

GL_FOG_START

start

안개함수 시작거리

GL_FOG_END

end

안개함수 종료거리

GL_FOG_COLOR

color[4]

안개색 (r, g, b, a)

GL_FOG_INDEX

index

안개색(컬러 인덱스)

<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>f</mi><mo>=</mo><mfrac><mfenced><mrow><mi>e</mi><mi>n</mi><mi>d</mi><mo>-</mo><mi>z</mi></mrow></mfenced><mfenced><mrow><mi>e</mi><mi>n</mi><mi>d</mi><mo>-</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>r</mi><mi>t</mi></mrow></mfenced></mfrac><mo>&#xA0;</mo><mo>&#xA0;</mo><mfenced><mrow><mi>G</mi><mi>L</mi><mo>&#xA0;</mo><mi>L</mi><mi>I</mi><mi>N</mi><mi>E</mi><mi>A</mi><mi>R</mi></mrow></mfenced><mspace linebreak="newline"/><mi>f</mi><mo>=</mo><mpadded lspace="-1px"><msup><mi>e</mi><mrow><mo>-</mo><mfenced><mrow><mi>d</mi><mi>e</mi><mi>n</mi><mi>s</mi><mi>i</mi><mi>t</mi><mi>y</mi><mo>&#xB7;</mo><mi>z</mi></mrow></mfenced></mrow></msup><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mfenced><mrow><mi>G</mi><mi>L</mi><mo>&#xA0;</mo><mi>E</mi><mi>X</mi><mi>P</mi></mrow></mfenced></mpadded><mspace linebreak="newline"/><mi>f</mi><mo>=</mo><mpadded lspace="-1px"><msup><mi>e</mi><mrow><mo>-</mo><msup><mfenced><mrow><mi>d</mi><mi>e</mi><mi>n</mi><mi>s</mi><mi>i</mi><mi>t</mi><mi>y</mi><mo>&#xB7;</mo><mi>z</mi></mrow></mfenced><mn>2</mn></msup></mrow></msup><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mfenced><mrow><mi>G</mi><mi>L</mi><mo>&#xA0;</mo><mi>E</mi><mi>X</mi><mi>P</mi><mn>2</mn></mrow></mfenced></mpadded><mspace linebreak="newline"/><mi>C</mi><mo>=</mo><mi>f</mi><msub><mi>C</mi><mrow><mi>s</mi><mi>o</mi><mi>u</mi><mi>r</mi><mi>c</mi><mi>e</mi></mrow></msub><mo>+</mo><mfenced><mrow><mn>1</mn><mo>-</mo><mi>f</mi></mrow></mfenced><msub><mi>C</mi><mrow><mi>f</mi><mi>o</mi><mi>g</mi></mrow></msub></math>

      • ex)
        GLfloat fcolor[4]={1.0, 0.0, 1.0, 0.5};
        glEnable(GL_FOG);
        glFogf(GL_FOG_MODE, GL_EXP);
        glFogf(GL_FOG_DENSITY, 0.5);
        glFogv(GL_FOG, fcolor);

  • Dithering

    • 프레임 버퍼의 용량(비트 평면 수)이 적다면 디더링을 사용하여 다양한 색 표현 가능

    • glEnable(GL_DITHER)

  • Logical Operations

    • glEnable(GL_COLOR_LOGIC_OP);
      glLogicOp(GLenum opcode);
      glDisable(GL_COLOR_LOGIC_OP);



Section 04. 화소 연산

GL이 이해하는 것은 화소일 뿐 JPEG, GIF 등 영상 파일의 저장형식을 이해하지는 못하기 때문에 GL은 영상 파일 자체를 그대로 화면에 그려내지 못한다. 이러한 파일을 사용하기 위해 GL이 이해하는 형식으로 변환해줘야 한다.

  • Pixel Storage Mode

    • 영상을 효율적으로 저장하고 검색하기 위해 데이터 경계선을 몇 바이트로 할 것인지, 몇 행을 뛰고 읽을 것인지, 주소를 어떻게 지정할 것인지 등을 말한다.

    • void glPixelStore{if}(GLenum pname, GLfloat param);

  • Pixel Transfer Operations

    • 색 값을 어떻게 변경할 것인가

    • 다른 그래픽 시스템에서 읽은 컬러 값을 지엘의 컬러 값 범위로 변경시켜야 한다.
      ex) [0, 255] -> [0, 1]

    • void glPixelTransfer{if}(GLenum pname, GLfloat param);

  • 비트맵(생략)

    • 프레임 버퍼에 쓰기 위한 화소 기본요소 중 2차원 배열로 표현되는 영상.

    • 화소 당 1비트

    • 어떤 화소를 변경할 것인가를 결정하는 일종의 마스크

  • 화소맵(생략)

    • 프레임 버퍼에 쓰기 위한 화소 기본요소 중 2차원 배열로 표현되는 영상.

    • 화소 당 여러 비트를 할애한 것으로서 실제 영상의 색에 해당.


Section 05. A-버퍼

  • 일반적 정의

    • Anti-Aliased Buffer / Area-Average Accumulation Buffer

    • Depth 버퍼는 가까운 물체의 깊이만 저장하는 반면,
      A 버퍼는 그 뒤 물체까지 연결리스트 형태로 유지한다.

    • 저장 정보 : RGB Intensity, Trasparency, Depth, Pixel Area Coverage(화소 점유율) ...

    • 위 그림에서 하나의 화소는 단일 색으로 칠해야 하기 때문에 A, B, C 색까지 감안한 혼합 색을 칠함으로써 에일리어싱을 완화시킨다.

  • GL의 A 버퍼

    • 단일 버퍼로서 여러개의 영상을 누적으로 저장하는 버퍼

    • void glAccum(GLenum op, GLfloat value);

연산(op)

의미

GL_ACCUM

glReadBuffer( )에 의해 선택된 버퍼의 (R, G, B, A) 값을 읽어서 value를 곱한 값을 현재 A 버퍼에 더한다.

GL_LOAD

GL_ACCUM과 같으나 결과를 A 버퍼에 직접 기록한다.

GL_RETURN

A 버퍼의 내용을 읽어서 value에 곱한 결과를 프레임 버퍼에 기록한다.

GL_ADD, GL_MULT

A 버퍼 내용을 읽어서 value에 더한/곱한 결과를 다시 A 버퍼에 저장한다.

    • Full Screen Anti-aliasing(화면 안티 에일리어싱)

    • Depth of Field(필드 깊이 조절)

    • Motion Blur

    • Soft Shadow


Section 06. 비트맵 파일 읽기

  • PGM(PBM/PGM, PPM) 파일 형식