2022. 7. 17. 19:48ㆍPublic/Shader
가장 간단하고 "옛날 비디오 게임 st" 처럼 보이는 간단하고 단순한 라이팅에 대해서 배워볼것이다.
셰이더가 발전해온 변천사를 이해하는데도 도움을 줄것이다.
라이팅 계산시에 각기 다른 부분을 지칭하는데 사용한 며가지 용어들이 존재했었다.
디퓨즈(Diffuse) : 불규칙한 미세면을 가진 표면의 부분집합이다. 다양한 방향으로 빛을 반사한다.
스펙큘러(Specular) : 정렬된 미세면을 가진 표면의 부분집합이다. 비슷한 방향으로 빛을 반사한다.
엠비언트(Ambient) : 씬 안에서의 최소 빛의 강도다. 따라서 빛이 전혀 도달하지 않는 곳이라 해도 단순 검정색이 되지 않게 한다.
근사란?
근사(Approximation)라는 것은 값이나 수량이 거의 가깝지만 정확한 것이 아님을 의미한다. 여기에서의 근사란 렌더링 방정식의 일부분을 계산하는 대안을 의미한다.
디퓨즈 근사
디퓨즈를 더 실용적인 용어로 정의해보자. 빛이 어떤 표면을 때렸을 때를 상상해보자. 그런 후 어떤 방향으로 반사됐다고 하자. 이때 어느 방향으로 반사될지에 대한 가능성은 동일하다.
* 오직 방향과 색상 , 그리고 빛의 강도에만 신경을 쓴다. 미세 표면의 성질에 대해서는 신경 쓰지 않는다.
* 목적은 렌더링된 모델의 각 픽셀이 얼마나 많은 빛이 쬐고 반사되는지 결정하는 것이다.
* 표면의 불투명 색상 (unlit color)과 함께 빛의 강도와 색상 및 방향을 전달하면 최종 이미지에서의 그 지점의 색상을 받을 수 있다.
* 이것을 정점 셰이더로 구현할 수 있다.
* 계산적인 측면에서는 보통 픽셀보다 정점이 더 적기 때문에 더 저렴하다.
* 인위적으로 보이는 단점이 있다.
스펙큘러 근사
빛이 표면을 쬐는데 오직 몇 가지 방향으로만 반사된다고 생각해보자. 이러한 수준의 근사에서 스펙큘러 라이트는 거의 완벽에 가까운 조그마한 흰색원으로 보일 것이다.
이 근사법은 오직 빛의 강도와 색상 및 방향만 신경쓴다.
디퓨즈와 스펙큘러의 조합
디퓨즈와 스펙큘러라는 용어는 동일한 표면에 대부분 동시에 나타날 것이다. 금속 재질은 디퓨즈 요소가 적고 스펙큘러 요소가 더 많지만 그럼에도 불구하고 여전히 디퓨즈 요소가 존재한다. 이 둘을 조합해 라이팅 계산을 표현하는 데 일반적으로 사용하는 그림이 있다. (생략)
디퓨즈
빛이 표면에 들어가는 각도의 중요성에 대해 이야기를 했었다. 이 각도를 입사각이라고 하는데 입사각이 클수록 표면은 광선으로부터 더 작은 양의 빛을 받을 것이다. 각도가 90도보다 크다면 표면은 빛을 전혀 받지 못한다.
표면이 받을 밝기/빛의 크기를 계산하기 위해서 코사인 입사각을 사용한다. 셰이더에서 라이팅을 계산하려면 표면의 노멀 벡터와 빛 벡터의 각도를 계산해야 한다. 벡터는 숫자 값만을 의미하지 않는다.
셰이더 언어에서 벡터는 일반적으로 두 가지, 세 가지, 네 가지 원소를 가질 수 있다. 여기에서 필요한 연산을 내적(dot product)이라고 한다. 코사인과 내적 함수 모두 모든 셰이더 언어에서 지원한다. 코드로 변환해보면 다음과 같다.
float brightness = cos(angle_of_incidence) // 입사각으로 구하는 밝기
float brightness = dot(normal,lightDir) //노말 벡터와 빛의 방향 벡터로 계산한 밝기
float pixelColor = brightness * lightColor * surfaceColor // 최종 표면 색상값
이 기본 디퓨즈를 람버트(Lambert) 혹은 람버트 반사율(LambertianRelectance)이라고 한다.
빛의 방향 벡터와 노멀 벡터의 내적에 빛의 색상과 강도를 곱하면 해당 위치의 픽셀 색상을 얻을 수 있다.
'Public > Shader' 카테고리의 다른 글
Cubemap Reflection (0) | 2022.07.25 |
---|---|
커스텀 라이팅2 (0) | 2022.07.17 |
좌표 공간 (0) | 2022.07.10 |
정점 색상 지원 (0) | 2022.07.10 |
프레그먼트 데이터 구조체 & 프레그먼트 함수 (0) | 2022.07.10 |