8.1 빛과 재질의 상호작용

조명을 사용할 때에는 정점 색상들을 직접 지정하지 않음. 표면의 재질들과 표면에 비출 빛들을 지정하고 조명 방정식을 적용해서 정점 색상이 결정되게 한다.

 

국소 모형 조명

ㄴ 대부분의 실시간 응용 프로그램이 사용하는 조형 모형으로 각 물체는 광원에서 직접 방출된 빛만 다룬다. (다른 물체에 의해 반사되어 들어오는 빛은 무시한다.)

전역 모형 조명

ㄴ 다른 물체에 의해 반사되어 들어오는 빛도 계산한다. 비용이 커서 실시간 게임에 사용하기에는 비용이 크다.

 

8.2 법선 벡터

정점 자료에 Normal 성분 값이 정점 법선 벡터 값인데 조명 계산에 쓰인다.

삼각형의 세 꼭짓점에서만 표면 법선을 계산해도 래스터화 과정에서 법선 성분 값이 보간되어 필요한 모든 표면 법선을 얻을 수 있다.

 

8.2.2 법선 벡터의 변환

법선 벡터를 비균등 비례변환이나 전단변환하게 되면 변환된 접선 벡터와 법선벡터는 서로 수직이 아니게 된다.

접선 벡터에 A 행렬로 변환 했다면 법선 벡터에는 A 역행렬의 전치행렬을 사용하여 변환하면 서로 수직이 된다.

 

8.3 조명의 주요 벡터

시점(E) : 눈의 위치

 

빛 벡터(L) : 표면의 점에서 광원을 가리키는 방향

반사 벡터(R) : 입사광이 표면 법선 n을 기준으로 반사된 방향

 

8.4 람베르트 코사인 법칙

복사 조도: 단위 면적당 복사 선속(빛 에너지)

비스듬히 비출수록 어두워짐

감소되는 빛의 비율는 L과 n의 내적으로 구할 수 있다. (L과 n이 수직이면 0)

8.5 분산 조명 (Diffuse)

분산 반사 (난반사): 모든 방향으로 고르게 반사되는 빛

ㄴ 색상과 분산 반사율의 내적으로 구해진다.

 

주변 조명

ㄴ 주변광(근사값)과 분산 반사율의 내적

 

8.7 반영 조명 (Specular)

프레넬 효과(Fresnel effect) : 두 매질 사이의 경계면에 빛이 도달하면 빛의 일부는 반사되고 나머지는 굴절되는 현상

 

ㄴ 매질에 따라 반사되는 빛의 양이 다르다.

ㄴ 법선벡터 n과 L 사이의 각도가 클수록 반사되는 빛의 양이 커진다.

 

표면 거칠기

ㄴ 완벽한 거울이 아닌 이상 반사된 빛은 거칠기의 정도에 따라 원뿔 모양으로 퍼진다.(반영 돌출부)

ㄴ 거칠기에 따라 정규분포 함수의 모양이 달라진다. 거칠기가 커지면 빛 에너지가 더 넓고 약하게 퍼지고

거칠기가 작으면 좁고 강하게 퍼진다.

8.8 조명 모형 정리

ㄴ 프레넬 값(매질의 속성), 분산 반사율, 거칠기 계수가 재질의 속성을 결정하는데 사용된다.

8.9 재질의 구현

정점에 색상을 지정하는 대신에 정점에 재질 값을 설정하고 텍스처 매핑을 사용한다.

 

물체 각각의 세계 행렬과 마찬가지로 각각의 재질을 담은 상수 버퍼를 업로드 힙에 올려서 관리한다.

여러 renderitem의 material 포인터가 같은 material 객체를 참조하면 여러 renderitem이 같은 재질을 사용할 수도 있다.

Material 객체에는 자기 자신의 상수 버퍼 index를 저장하고 있다.

 

8.10 평행광 (지향광)

빛의 색상과 빛의 벡터로 정의됨

8.11 점광

감쇠 계수를 구하기 위해 falloffstart와 falloffend라는 거리에 따라 빛이 감소하는 지점을 정의해아 한다.

감쇠 계수의 구간은 [0, 1]이며 광원에서 falloffstart 떨어진 점이 받는 계수는 1이고 falloffend가 받는 계수는 0이다.

이를 광원 값(색상)에 곱한다.

 

8.12 점적광

점적광 계수 : d와 -L의 각도 차이가 클수록 감소함, 지수 s를 조율하여 빛의 세기가 0으로 떨어지는 각도를 제어할 수 있음

빛의 색상에 감쇠계수와 점적광 계수를 모두 곱해야 해서 가장 연산비용이 비싸다.

 

8.13 조명 구현

셰이더 파일에 struct Light를 정의하고 패스 상수 버퍼에 사용하는 조명의 정보를 Light 배열로 넘긴다.

주변광 빛도 포함한다.

 

C++의 구조체 멤버와 hlsl의 구조체 채우기 방식을 동일하게 하여야 한다.

지향광, 점광, 점적광의 조명 계산 함수는 LightingUtil.hlsl이라는 셰이더 파일에 정의되어 있다.

 

픽셀 셰이더에서 한 표면의 점에 대해 모든 조명에 대한 계산을 하여 색상을 누적한 값이 최종 픽셀 색상이 된다.

 

연습문제

1.

B,G 값을 진동시키기 위해 전체 시간(초 단위)을 sin 함수에 넣음

4.

구 위치에 점광 10개를 만듬
Default.hlsl 파일에서 점광이 10개인 것을 기록

6.

툰 셰이딩 결과
거리에 따른 빛의 세기를 계산하는데 쓰이는 CalcAttenuation 함수를 변형하여 툰 셰이딩을 수행

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/8/Chapter%208%20Lighting

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

10. 혼합  (0) 2022.06.22
9. 텍스처 적용  (0) 2022.06.21
7. Direct3D의 그리기 연산 제2부  (0) 2022.06.17
6. Direct3D의 그리기 연산  (0) 2022.06.16
5. 렌더링 파이프라인  (0) 2022.06.14

+ Recent posts