일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Cartoon Rendering
- working set
- ColorGradingLutPass
- URP
- 벡터
- 프로그래밍 기초
- Cell Look
- 메모리 누수
- 3d
- Windows Build
- ASW(Application SpaceWarp)
- C언어
- Virtual Byte
- Cell Shader
- Private Bytes
- Rim Light
- Specular
- AppSW
- VR
- 가상 바이트
- 게임 수학
- Three(Two) Tone Shading
- 개인 바이트
- 작업 집합
- OculusMotionVectorPass
- Toon Shader
- URP로 변경
- Today
- Total
WinCNT
조명 처리 본문
광원의 요소(Legacy Model)
1. 주변광(Ambient Light)
특정한 방향이 없이 주변을 덮고 있는 빛을 의미한다
직접적인 광원과는 상관 없이 여러 가지 요소들에 부딪히고 반사되어
점차 방향을 잃어버린 빛의 형태에 해당한다(간접 광원)
PBR에서는 IBL로 간접 광원 등을 구하기에 좀 더 사실적으로 구해지지만,
레거시 모델에서는 상수 값으로 계산에 덧셈되는 이상적인 빛
(정밀하게 계산하는 SSAO 등의 테크닉이 있긴 하다)
2. 확산광(Diffuse Light)
일정한 방향으로 빛이 들어와서 물체의 표면에서 여러 방향으로 분산되는 빛을 의미한다
시점(눈)과는 상관 없으며, 빛을 받는 정도에 비례해서 밝게 보인다
3. 반사광(Specular Light)
특정한 방향으로 유입되어 한 방향으로 완전히 반사되는 빛을 의미한다
시점(눈)으로 정반사된 빛이기 때문에 물체 표면에 밝은 원으로 보이는 부분이 반사광이다
광원의 종류
1. Directional Light
방향만 존재하는 광원
위치가 없다, 그래서 위치를 바꿔도 빛이 강해지지 않는다
예시로는 태양 빛이 있다
Directional light는 방향 벡터만 영향을 주므로
Unity 등에서 directional light 움직여 물체의 밑에 놓아도
빛이 들어오는 방향은 바뀌지 않는다
그 지점에서의 확산광은 법선 벡터와 광원 벡터를 내적하면 구할 수 있다
그 때의 광원 벡터임
광원 중 연산이 매우 간단하다
2. Point light
방향이 없고 위치만 존재하는 광원
예시로는 전구가 있다
벡터의 뺄셈 연산이 한 번 더 들어간다
그래도 고작 뺄셈이라 연산 부하가 그다지 크진 않다
point light에는 어테뉴네이션(감쇄값)이 존재한다
빛이 거리에 따라서 감쇄되는 것을 계산함
그래서 우리가 어디까지 빛이 퍼져갈 것인지 정할 수 있다
3. Spot light
색상, 위치, 빛을 방출하는 방향으로 구성되는 광원
예시로는 손전등이 있다
(자주 쓰이지 않는다)
조명 처리
램버트의 코사인 법칙
주변광은 빛을 받는 양에 비례해서 밝아진다
광원이 물체와 수평이면 빛을 받는 양이 없기 때문에 어두울 것이고(간접광 고려 안 함)
광원이 물체와 수직이면 빛을 가장 많이 받기 때문에 가장 밝을 것이다
즉 물체 표면에서 반사하는 빛의 휘도(Luminance)는
빛의 입사 벡터 L과 표면의 법선 벡터 N이 이루는 각도의 코사인에 비례한다
라고 정리한 것이 램버트 코사인 법칙이다
빛으로 향하는 벡터 값(빛에서 들어오는 벡터가 아님)과 물체의 노멀 값으로 계산한다
1. 주변광(Ambient)
2. 확산광(Diffuse)
3. 반사광(Specular)
하이라이트를 구할 수 있음
R은 반사 벡터(Reflection)
V는 시선 벡터, 눈(카메라)
반사 벡터를 구할 때는 다른 방법도 있음
짐블린의 하프앵글벡터
N dot H
약간의 차이가 있으나 연산이 쉽고 값이 거의 같기 때문에 모바일에서 자주 사용된다
(R 내적 V)의 제곱을 하면 조금 더 반짝거리는 느낌을 줄 수 있음(값이 낮아지므로)
이로써 물체의 재질, 거친 정도(러프니스)을 나타낼 수 있음
제곱이 커질 수록 표면이 매끄러운 표면처럼 보이고 낮을 수록 거칠어진 느낌이 난다
문제는 아트의 시선일 뿐, 물리적 근거가 없다
그래서 물리적인 근거로 만들어진 것이 바로 PBR이다
아무튼 Ambient, Difuuse, Specular를 처리하면 일반적인 빛 처리가 끝나게 된다
정점별 조명(per vertex light)
픽셀별 조명(per pixel light)
요즘에는 GPU 성능이 좋아져서 보통 픽셀별 조명으로 구현한다
SSS
'게임 프로그래밍(학습 내용 정리) > 게임 수학' 카테고리의 다른 글
Direct2D - 흑백 쉐이더 만들기 (0) | 2022.01.19 |
---|---|
PBR (0) | 2022.01.11 |
계층 구조와 애니메이션 보간 기초 (0) | 2022.01.11 |
변환 파이프라인 (0) | 2022.01.04 |
좌표계 (0) | 2021.12.28 |