일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Win32 API
- window programming
- 윈도우 프로그래밍
- 컴퓨터 아키텍쳐
- 셰이더프로그래밍
- 윈도우
- 그래픽스
- 윈도우프로그래밍
- 윈도우 구조
- shader
- 운영체제
- c4d
- 베지에 곡선
- Geometry Modeling
- bezier curve
- 핵심 API로 배우는 윈도우프로그래밍
- Graphics
- modeling
- MFC
- win32
- 그래픽스기초
- shader programming
- 셰이더
- MFC 윈도우 프로그래밍
- 컴퓨터 구조
- 오픈지엘
- denoising
- OpenGL
- 렌더링
- Mesh Processing
- Today
- Total
오다기리 박의 알고리즘 노트
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 10. 조명과 음영(Lighting and Shading) 본문
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 10. 조명과 음영(Lighting and Shading)
오다기리 박 2019. 2. 14. 21:14Chapter 10. 조명과 음영(Lighting and Shading)
Section 01. 조명 (Lighting)
조명과 음영
렌더링 = 조명(Lighting) + 음영(Shading)
Lighting : 광원과 물체 특성을 감안하여 정점에서의 빛 세기를 계산하는 작업
Shading : 이렇게 결정된 정점 색을 기준으로 해당 물체면 내부 곳곳마다 색을 부여하는 작업
전역 조명모델과 지역 조명모델
전역 조명모델 (Global Lighting Model) : 장면 내의 물체 상호간의 반사까지 고려한 모델
지역 조명모델 (Local Lighting Model) : 광원으로부터 직접 물체에 부딪쳐 우리 눈에 들어오는 빛만 고려한 모델
Section 02. 지역 조명모델(Local Lighting Model)
주변광 (Ambient)
주변 반사에 의해 우리 눈으로 반사되는 빛
시점의 위치에 무관하게 모든 물체면에 대해 일정 크기로 밝기를 증가시킴
난반사 (Diffuse)
물체면과 광원과의 공간적인 관계에 따라 명암을 부여한 것
정반사 (Specular)
Phong 조명 처리식
Blinn 조명 처리식
r계산이 필요없으므로 좀 더 빠르다
정반사 성분은 시야 종속적 (view-dependent)
점 p에서 색상 계산
표면의 광택도 (shininess) : 클수록 하이라이트가 좁고 표면이 반질반질하게 보임
조명모델
입력
광원 색상
물체의 반사계수
전반사 지수 :
출력 색상
Section 03. 음영(Shading)
Flat 셰이딩
하나의 삼각형의 법선벡터가 모두 같다.
색상값은 개별 삼각형에 대해서 계산되고 그 삼각형 전체가 이 색으로 채워짐
삼각형 중심점에 조명모델을 가하고 그 결과 색으로 삼각형 내부를 모두 동일하게 채운다
실행시간 빠름
“mach band effct” 발생
Gouraud 셰이딩
정점의 법선벡터는 인접 면의 법선벡터를 평균하여 구한다.
삼각형의 각 정점에서 조명값이 정해지고, 계산된 색상이 삼각형의 표면 전체로 보간됨
삼각형의 정점에서만 조명 효과를 계산하기 때문에 빠른편
객체의 LOD에 따라 셰이딩 품질이 달라짐.
LOD가 높아지면 Phong 셰이딩효과를 낼 수 있으며 알고리즘이 느려진다. 이 방법을 이용하면 Gouraud 셰이딩을 하드웨어가 Phong 셰이딩기처럼 동작하도록 할 수 있다.
정반사 하이라이팅을 잘 표시하지 못함, spot light 효과를 잘 살리지 못함.
“mach band effct” 발생
Phong 셰이딩
정점의 법선벡터는 인접 면의 법선벡터를 평균하여 구한다.
각 정점의 법선을 이용하여 삼각형에 해당되는 각 픽셀의 법선 벡터를 보간함. (이 법선은 이후에 그 점에서 조명 효과를 계산하는 데 사용됨.)
픽셀별 조명 처리를 하는 것은 정점별 조명 처리(Gouraud 셰이딩)보다 복잡하고 비용이 크다.
모델링 시에 곡면을 평면에 근사시키지만 렌더링 단계에서 원래 곡면의 방향을 복원하여 조명모델을 계산함으로써 정밀도를 기한다.
벡터를 보간하기 때문에 Gouraud 셰이딩보다 3배 느리다
Section 04. GL 조명과 음영
Lighting 활성화
조명기능이 활성화되면 물체의 색은 광원과 물체의 특성에 의해서만 좌우되고 glColor*() 함수의 기능은 무시된다.
glEnable(GL_LIGHTING)
glDisable(GL_LIGHTING)
Light 정의
1) Light 활성화
glEnable(GL_LIGHT0~7)
2) Light 종류, 색 명시
void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
pname 종류
pname 종류 | 기본값 | 의미 |
GL_AMBIENT | (0,0,0,1) | 광원의 주변광 |
GL_DIFFUSE | (1,1,1,1) | 광원의 난반사 |
GL_SPECULAR | (1,1,1,1) | 광원의 정반사 |
3) 거리에 따른 빛의 약화
void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
pname 종류
pname 종류 | 기본값 | 의미 |
GL_CONSTANT_ATTENUATION | 1 | a 계수 |
GL_LINEAR_ATTENUATION | 0 | b 계수 |
GL_QUADRATIC_ATTENUATION | 0 | c 계수 |
4) Light의 위치 제어
고정위치
움직이는 광원
시점을 따라가는 광원
pname 종류
pname 종류 | 기본값 | 의미 |
GL_POSITION | (0,0,1,0) | 광원의 (x,y,z,w) |
GL_SPOT_DIRECTION | (0,0,-1) | 스포트라이트의 방향 |
GL_SPOT_CUTOFF | 180 | 조명각 |
GL_SPOT_EXPONENT | 0 | 코사인 승수 |
Shading Model 정의
glShadeModel(GL_SMOOTH);
glShadeModel(GL_FLAT);
Surface Normal 정의
void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
정규화 : glEnable(GL_NORMALIZE);
Surface Material Property 정의
물체면의 색과 매끄러움 같은 특성을 정의하는 것
void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
face종류
face 종류 |
GL_FRONT |
GL_BACK |
GL_FRONT_AND_BACK |
pname종류
pname 종류 | 기본값 | 의미 |
GL_AMBIENT | (0.2,0.2,0.2,1) | 주변광에 대한 물체색 |
GL_DIFFUSE | (0.8,0.8,0.8,1) | 난반사에 대한 물체색 |
GL_AMBIENT_AND_DIFFUSE | 주변광+난반사에 대한 물체색 | |
GL_SPECULAR | (0,0,0,1) | 정반사에 대한 물체색 |
GL_EMISSION | (0,0,0,1) | 물체의 발광색 |
GL_SHININESS | 0 | 정반사의 광택계수 |
Lighting Model 정의
광원, 물체특성과 직접 연관되지 않는 것들을 정의한다.
1) 전역 주변광
ex) GLfloat MyGlobalAmbient[ ] = {0.2, 0, 0, 1};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, MyGlobalAmbient);2) 시점 위치
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
시점 위치가 물체에 매우 가까운 것으로 간주되어 물체면을 구성하는 모든 삼각형마다 별도의 시점벡터가 계산된다. 정확한 정반사가 계산되고 사실적인 결과를 얻지만 계산시간이 오래걸린다.
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
시점이 시점벡터방향으로 무한대 거리에 있는 것으로 간주되어 모든 삼각형 메쉬에 대해 동일한 시점벡터를 사용하므로 계산시간을 줄일 수 있다.
3) 양면 조명
동시에 front face와 back face가 노출될 때에는 양면 모두에 lighting과 shading을 가해야 한다.
glLightModeli(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE);
양면 모두에 광원이 작용한다.
이 경우 glMaterialfv()로 양면의 물체 특성을 정의해야한다.
glLightModeli(GL_LIGHT_MODEL_TWO_SIDED, GL_FALSE);
표면에만 광원이 작용한다.
void glLightModeli(GLenum pname, GLint param);
pname 종류
pname 종류 | 기본값 | 의미 |
GL_LIGHT_MODEL_AMBIENT | (0.2,0.2,0.2,1) | 전역 주변광 RGBA |
GL_LIGHT_MODEL_LOCAL_VIEWER | GL_FALSE | 시점벡터 계산법 |
GL_LIGHT_MODEL_TWO_SIDE | GL_FALSE | 이면 조명 여부 |
'컴퓨터 그래픽스 > OpenGL' 카테고리의 다른 글
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 12. 프래그먼트 연산 (0) | 2019.02.14 |
---|---|
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 11. 텍스쳐 (Texture) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 09. 래스터변환(Rasterization) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 08. 가시성 판단 (Visibility Detection) (0) | 2019.02.14 |
[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 07. 투상변환과 뷰포트변환 (0) | 2019.02.14 |