readme.md
기록소
readme.md
전체 방문자
오늘
어제
  • 분류 전체보기
    • 네트워크
      • HTTP
      • 윈도우 소켓 프로그래밍
    • Windows API
    • 그래픽스
      • DirectX11
    • 일반
      • Linux
      • 데이터베이스
      • 팁
      • 책 후기
    • 쿠버네티스
    • 프로그래밍 언어
      • C#
      • Java
      • Go
      • C++
      • Lua
    • 책
      • 이펙티브 C++
      • 제프리 리처의 WINDOWS VIA C, C++
    • 기타

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • Graphics
  • 캐스팅
  • const
  • C++
  • new
  • windowsAPI
  • DirectX
  • emplace
  • 소멸자
  • Delete
  • CPP
  • phong
  • 자원관리
  • wm_keyup
  • 생성자
  • 인터페이스
  • 가상함수
  • 버텍스 버퍼
  • 소켓 프로그래밍
  • 대입연산자
  • id3d11shaderresourceview
  • 초기화
  • directx11
  • 자바8
  • 설계
  • 상속
  • 윈도우 소켓
  • consteval
  • 템플릿
  • imagestride

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
readme.md

기록소

그래픽스/DirectX11

조명

2024. 5. 8. 19:18

물체를 보다 실감나게 표현하기 위해서는 물체의 재질(material)과 광원의 상호 작용이 필요하다. 광원을 고려하지 않고 픽셀의 색을 결정한다면 텍스처의 샘플링 값이나 버텍스 버퍼나 다른 버퍼에 저장된 물체의 색을 그대로 사용하면 되겠지만, 현실과 가까운 느낌의 물체를 렌더링 할 수는 없을 것이다.

 

물체의 색을 결정하기 위해선 광원에서 나온 빛이 물체와 충돌하고 반사되어 나온 빛이 관찰자의 눈으로 들어와야 된다. 이 과정에서 눈에 들어오는 빛의 세기 역시 색의 결정에 영향을 주게 된다. 따라서 조명을 사용하여 물체를 렌더링 하고자 한다면 빛의 방향, 빛의 세기, 빛의 위치 등과 같은 광원에 대한 정보와 함께 반사되는 빛의 유형에 대한 정의도 필요하다. DirectX에서 조명 효과를 만들기 위해 일반적으로 고려하는 빛의 유형은 다음과 같다.

앞으로 살펴볼 ambient, diffuse, specular는 빛의 유형에 따라 물체의 색에 후보정을 해주는 작업에 사용되는 요소이다. 이 요소들은 물체가 가지고 있는 그 자체의 색이나 텍스처로부터 샘플링된 값에 곱하여 사용하는 것이 일반적이다.

1. Ambient Light(주변광, 환경광)

우리 눈이 물체를 인식하기 위해선 물체에서 반사되어 나온 빛이 필요하다. 물체에서 반사되어 나온 빛은 크게 두 종류로 나눌 수 있는데, 하나는 빛이 직접 물체와 부딪혀 반사되어 나오는 것과 다른 하나는 주변 물체에서 반사된 빛을 받아 반사되는 것이다. ambient는 후자의 빛을 의미한다.

 

가장 정확한 ambient의 추적을 위해서는 반사되어 어떤 물체로 들어오는 모든 빛을 추적해야 하지만 컴퓨터 그래픽스에서는 효과적인 구현을 위해 일반적으로 ambient는 상수로 취급한다. 어떤 물체가 가지고 있는 그 자체의 색이 화면에서 완전히 가려지는 것을 방지하기 위해 (0.1, 0.1, 0.1)과 같이 사용하면 된다.

2. Diffuse Light(난반사광)

앞에서 살펴본 ambient가 주변 물체에서 반사되어 들어온 빛이라면, diffuse와 뒤에서 볼 specular는 광원이 물체와 부딪혀 반사되어 나온 빛이라고 할 수 있다. 그 중에서 diffuse는 난반사에 대한 성분을 의미한다.

 

난반사는 어떤 물체에 입사된 빛이 특정 방향으로 반사되는 것이 아니라 여러 방향으로 불규칙하게 반사되는 것을 의미한다. 난반사되는 빛의 방향이나 세기는 물체의 표면 재질에 따라 달라지며, 불규칙적이고 예측할 수 없다. 따라서 컴퓨터 그래픽스에서는 난반사된 빛을 모두 추적하는 것은 매우 어려운 작업이므로 근사치 모델을 사용한다. 난반사된 모든 빛이 모든 방향으로 균일한 힘을 가지고 주위에 영향을 준다고 가정하는 것이다.

 

결과적으로 diffuse에 영향을 주는 요소는 물체로 들어오는 빛의 세기이다. 빛은 물체와 충돌할 때 서로 수직인 경우에 가장 큰 힘을 가지게 된다. 이를 계산하기 위해 필요한 요소는 빛을 받는 물체의 표면의 노멀 벡터 $n$과 물체의 표면에서 광원으로 향하는 벡터 $l$이다. 이 두 벡터가 이루는 각이 0에 가까울수록 빛은 온전하게 물체에 영향을 줄 것이다. 이 값은 두 벡터의 내적으로 구할 수 있다.

3. Specular Light(정반사광)

specular는 정반사되어 나온 빛의 성분을 표현하기 위해 사용한다. 정반사된 빛은 한 방향으로만 향하기 때문에 계산이 가능하다. 또한 반사된 빛의 방향과 관찰자의 시점에 따라 관찰자가 정반사된 빛의 요소를 못 볼 수도 있다. 그렇기 때문에 specular는 빛의 세기와 함께 관찰자의 시점도 함께 고려해야 한다.

 

쉐이딩 모델에 따라 specular를 계산하는 방법이 달라질 수 있는데, 퐁 쉐이딩에서는 정반사되어 나온 빛 $r$과 물체의 표면에서 관찰자의 시점으로 향하는 벡터 $e$와의 내적을 통해 시점에 따른 빛의 영향력을 계산할 수 있다.

'그래픽스 > DirectX11' 카테고리의 다른 글

쉐이더 리소스 뷰(ID3D11ShaderResourceView) 사용하기  (0) 2024.06.11
회전 행렬 유도  (0) 2024.05.13
노멀 벡터 변환  (0) 2024.05.08
쉐이더 만들기(버텍스, 픽셀)  (0) 2024.04.22
버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼  (0) 2024.04.22
    '그래픽스/DirectX11' 카테고리의 다른 글
    • 쉐이더 리소스 뷰(ID3D11ShaderResourceView) 사용하기
    • 회전 행렬 유도
    • 노멀 벡터 변환
    • 쉐이더 만들기(버텍스, 픽셀)
    readme.md
    readme.md

    티스토리툴바