일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- shader
- modeling
- 윈도우 구조
- shader programming
- Graphics
- 그래픽스기초
- 베지에 곡선
- 렌더링
- 윈도우 프로그래밍
- win32
- Mesh Processing
- OpenGL
- denoising
- 운영체제
- 컴퓨터 구조
- 윈도우
- 그래픽스
- 윈도우프로그래밍
- 셰이더프로그래밍
- Win32 API
- 셰이더
- bezier curve
- c4d
- 핵심 API로 배우는 윈도우프로그래밍
- 오픈지엘
- 컴퓨터 아키텍쳐
- MFC
- Geometry Modeling
- window programming
- MFC 윈도우 프로그래밍
- Today
- Total
오다기리 박의 알고리즘 노트
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 12. 프래그먼트 연산 본문
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 | |
GL_SRC_COLOR | Destination | |
GL_ONE_MINUS_DST_COLOR | Source | |
GL_ONE_MINUS_SRC_COLOR | Destination | |
GL_SRC_ALPHA | Source / Destination | |
GL_ONE_MINUS_SRC_ALPHA | Source / Destination | |
GL_DST_ALPHA | Source / Destination | |
GL_ONE_MINUS_DST_ALPHA | Source / Destination | |
GL_SRC_ALPHA_SATURATE | Source |
영상 합성(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 | 안개색(컬러 인덱스) |
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) 파일 형식
'컴퓨터 그래픽스 > OpenGL' 카테고리의 다른 글
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 13. 고급 렌더링 (0) | 2019.02.14 |
---|---|
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 11. 텍스쳐 (Texture) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 10. 조명과 음영(Lighting and Shading) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 09. 래스터변환(Rasterization) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 08. 가시성 판단 (Visibility Detection) (0) | 2019.02.14 |