베개발

[엔진심화] 11. IBL, SH, 블렌딩, Ramp, 노멀 맵 기초 본문

대학교 공부

[엔진심화] 11. IBL, SH, 블렌딩, Ramp, 노멀 맵 기초

rusal0204 2021. 6. 16. 23:44

목차

  • 보간기(Interpolator)
  • IBL
  • SH
  • 블렌딩
  • Ramp
  • 노멀 맵 기초

* 공부 과정에서 작성한 글이기 때문에 틀린 내용이 있을 수 있습니다.

 


■보간기 (Interpolator)

레스터라이저에서 수행하는 역할 중 하나로, 노멀, 버텍스 컬러, 텍스쳐 좌표 등이 보간된다.

레스터라이저가 하는 일은 크게 5개로 나누어진다.

Clipping, Perspective division, Back-face culling, Viewport transform, Scan conversion 이 그것인데, 여기에서 Scan conversion이 보간기이다.

레스터라이저가 픽셀 셰이더에 픽셀 값들을 하나씩 넘겨주는데, 버텍스에만 존재하던 값을 각각의 픽셀에 중간값을 계산하여 넣어주게 된다. 그것을 보간(Interpolation)이라고 한다.


■IBL

IBL은 Image Based Lighting의 약자로,

정반사(Specular)와 난반사(Diffuse) 정보를 큐브 텍스쳐로부터 얻어서 라이팅하는 것을 말한다.

 

서브스턴스 페인터의 환경맵 라이팅이 좋은 예이다.

위 4개의 달걀들은 모두 같은 철 재질들이지만, 주변 환경에 따라서 라이팅이 전체적으로 바뀌게 되어 느낌도 상당히 달라진다.

 

IBL 라이팅을 할 때는 되도록 HDR 이미지를 사용해야 한다. 라이팅을 위해 사용하는 것이므로 태양과 같은 밝은 광원들도 함께 표현될 수 있어야 하기 때문이다.

 

아래는 간단한 HDR이미지(업로드될땐 일반 이미지로 바뀌었다)와 해당 이미지를 사용한 결과물 예시이다.

 

https://hdrihaven.com/

 

HDRI Haven

100% Free High Quality HDRIs for Everyone

hdrihaven.com

위 사이트에서 무료 HDRI 이미지를 자유롭게 받을 수 있다.

 

■SH

SH는 Spherical Harmonics, 즉 구면조화함수의 약자이다.

위에서 언급한 이미지 기반 라이팅에서 라이팅할 정보를 얻어오는 과정에서 쓰인다고 한다.

 

간단하게 설명하자면, 특정 포인트에서 모든 방향으로 환경광의 정보를 표현하는 것이 구면좌표계 함수들로 이루어진 조합의 계수를 조절해서 표현 가능하다면, 굳이 IBL 큐브맵에 데이터를 저장하지 않고 계수만 저장하면 된다라는 발상에서부터 나온 것이다. (어떻게 구현했는지 지금은 자세히 몰라도 괜찮다.)

 

 이런 복잡한 과정을 우리는 half 3 ambient = SampleSH(IN.normal); 과 같은 코드를 이용해 편하게 추가해줄 수 있다.

SampleSH는 모든 방향의 Ambient 컬러 정보를 얻어오는 함수로, 라이트 프로브나 스카이박스로부터 값을 얻어온다.

 

 

 

 

■블렌딩

커스텀 셰이더에서도 알파 블렌딩과 같은 블렌딩 모드를 사용할 수 있다.

https://docs.unity3d.com/kr/530/Manual/SL-Blend.html

 

유니티 - 매뉴얼: ShaderLab: Blending

ShaderLab: Culling & Depth Testing ShaderLab: Blending Blending은 투명 색상을 만드는 데 사용합니다. 그래픽 렌더링되어 있으며 모든 쉐이더가 실행되고, 모든 텍스처가 적용되면 화면에 픽셀이 그려집니다.

docs.unity3d.com

일반적으로 위와 같은 것들을 사용하게 된다.

역시 렌더 순서가 중요하므로 렌더 큐를 잘 써 줘야 한다.

 

 

■Ramp, Diffuse warp

툰 렌더링에서 주로 사용하는 기법인데, 작은 그라데이션 텍스쳐를 이용해서 여러가지 색상을 조절하는 것을 Diffuse warp 기법이라고 한다. 이때 사용하는 텍스쳐를 Ramp Texture라고 한다.

 

위 사진을 보면 오른쪽 위에 있는 것이 해당 장면을 렌더할 때 쓰인 Ramp 텍스쳐이다.

 

 

 

■노멀맵 기초

- 탄젠트(Tangent)벡터

 

노멀맵은 탄젠트라는 개념을 알아야 모든 걸 설명할 수 있다.

탄젠트는 '접선' 이라는 뜻이다.

UV를 기준으로 했을때 U방향이 탄젠트, V 방향이 바이탄젠트이다.

 

노멀맵은 평면(탄젠트 공간)에서 XYZ 방향 정보가 그려진 벡터이다. 간단하게는 벡터를 텍스쳐로 표현한 것이 노멀맵이라고 할 수 있는 것이다.

 

이 XYZ 방향 정보는 RGB에 각각 저장되게 된다. 또한 표현되어있는 값들은 탄젠트 스페이스에 귀속되어 있다. (부모가 탄젠트 스페이스인것이다.)

 

이걸 엔진 내에서 사용하려면 이 벡터들이 월드 공간으로 변환이 되어야 하는데, 그렇게 하기 위한 변환 행렬을 커스텀 셰이더를 사용할 때 구축해주어야 한다.