리니어 렌더링 개요
리니어 렌더링이 있는 감마 텍스처

리니어 워크플로 또는 감마 워크플로

Unity 에디터는 리니어 워크플로와 감마 워크플로를 모두 제공합니다. 리니어 워크플로에는 감마 색 공간에서 작성한 텍스처가 리니어 색 공간에서 올바르고 정확하게 렌더링 될 수 있는 색 공간 크로스오버가 있습니다. 감마 색 공간과 리니어 색 공간에 관한 추가 정보는 리니어 렌더링 개요에 대한 문서를 참조하십시오.

추가 정보는 다음의 문서를 참조하십시오.

텍스처는 감마 색 공간에 저장되는 경향이 있는 반면, 셰이더는 리니어 색 공간을 사용합니다. 그래서 텍스처가 셰이더에서 샘플링 되는 경우 감마 기반 값이 부정확하게 나타납니다. 이를 극복하기 위해서는 Unity가 RGB 샘플러를 사용할 수 있도록 설정하여 감마 샘플링에서 리니어 샘플링으로 크로스오버 하면 됩니다. 그러면 리니어 워크플로에서 셰이더의 모든 입력과 결과물이 올바른 색 공간에 지정되어 정확한 결과가 계산됩니다.

감마 워크플로 또는 리니어 워크플로를 지정하려면 편집(Edit) > 프로젝트 설정(Project Settings) > 플레이어(Player) 로 가서 플레이어 설정(Player Settings) 을 엽니다. 그리고 기타 설정(Other Settings) > 렌더링(Rendering) 으로 가서 선호도에 따라 색 공간(Color Space)선형(Linear) 또는 감마(Gamma) 로 변경합니다.

색 공간 설정을 보여주는 플레이어 설정 창
색 공간 설정을 보여주는 플레이어 설정 창

감마 색 공간 워크플로

리니어 워크플로가 더 정확한 렌더링을 보장하긴 하지만, 사용자가 가끔 감마 워크플로를 선호하는 경우가 있을 수 있습니다(예를 들어, 일부 플랫폼에서는 하드웨어가 감마 포맷만 지원하는 경우도 있음 - 하단의 리니어 지원 플랫폼 참고 바람).

이 경우 플레이어 설정 창에 있는 Color SpaceGamma 로 설정하시기 바랍니다(메뉴: Edit > Project Settings > Player). 이렇게 옵션을 설정할 경우 렌더링 파이프라인은 저장된 감마 색 공간에 있는 모든 컬러와 텍스처를 사용합니다. 텍스처는 셰이더에서 사용될 때 감마 보정을 제거하지 않습니다.

텍스처의 인스펙터 창에 있는 sRGB (Color Texture) 체크박스의 체크를 해제해서 Color Space: Gamma 의 sRGB 샘플링 바이패스를 선택할 수 있습니다.

참고: 위의 값이 감마 공간에 있더라도 Unity 에디터의 셰이더에서는 입력값이 리니어 공간에 있는 것처럼 취급하여 계산합니다. 납득할 만한 최종 결과를 위해, 에디터는 셰이더 결과를 프레임 버퍼에 쓰고 최종 결과에 감마 보정을 적용하지 않을 때 불일치 포맷에 대한 수정을 수행합니다.

리니어 색 공간 워크플로

리니어 색 공간에서 작업할 경우 감마 색 공간에서 작업하는 것보다 더 정확하게 렌더링할 수 있습니다.

이 경우 플레이어 설정 창(메뉴: 편집(Edit) > 프로젝트 설정(Project Settings) > 플레이어(Player))의 색 공간(Color Space)선형(Linear) 으로 설정합니다.

리니어 색 공간이나 감마 색 공간에서 텍스처가 생성됐을 경우 리니어 색 공간에서 작업할 수 있습니다. 리니어 색 공간 셰이더 프로그램에 입력하는 감마 색 공간 텍스처 입력값은 감마 보정 제거와 함께 셰이더에 제공됩니다.

리니어 텍스처

  • Color Space: Linear 를 선택하면 텍스처의 위치가 감마 색 공간으로 지정됩니다. Unity는 GPU의 sRGB 샘플러를 기본값으로 사용하여 감마 색 공간을 리니어 색 공간으로 크로스오버합니다. 텍스처를 리니어 색 공간에 작성할 경우 sRGB 샘플링을 바이패스해야 합니다. 추가 정보는 리니어 텍스처로 작업을 참조하십시오.

감마 텍스처

참고

컬러의 경우 Unity 에디터가 해당 값을 GPU에 상수로 전달하기 전에 미리 부동소숫점으로 전환하기 때문에, 전환이 내부적으로 적용됩니다. 텍스처를 샘플링할 때, GPU에서는 감마 보정을 자동으로 제거하여 결과를 리니어 공간으로 전환합니다.

그 후 이 입력값은 셰이더로 전달되고 일반적인 경우와 마찬가지로 리니어 공간에서 조명 계산이 이루어집니다. 결과값을 프레임 버퍼에 작성할 때 현재의 렌더링 설정에 따라 곧바로 감마 보정되거나, 추후 감마 보정을 위해 리니어 공간에 남겨집니다. 예를 들어, 높은 동적 레인지(HDR)에서는 렌더링 결과값이 리니어 공간에 남겨져 추후 감마 보정 됩니다.

리니어 색 공간과 감마 색 공간의 차이

리니어 렌더링을 사용할 때 조명 계산에 사용하는 입력값은 감마 공간에 입력하는 입력값과 다릅니다. 이는 색 공간에 따라 결과가 달라짐을 의미합니다. 예를 들어 광원이 표면에 닿을때 각각 다른 리스폰스 커브를 가지며, 이미지 효과도 각각 다르게 작동합니다.

광원 감쇠

거리에 따른 감쇠(fall-off)와 노멀 기반의 조명은 두 가지 방식으로 다릅니다.

  • 리니어 모드에서 렌더링할 경우 추가 감마 보정으로 광원의 반지름을 더 크게 보이게 만들 수 있습니다.

  • 광원 에지도 더 선명하게 보입니다. 그 결과, 조명 강도가 표면에 더 정확하게 감쇠되도록 모델링됩니다.

왼쪽: 리니어 공간에서의 조명 구체. 오른쪽: 감마 공간에서의 조명 구체
왼쪽: 리니어 공간에서의 조명 구체. 오른쪽: 감마 공간에서의 조명 구체

리니어 강도 반응

감마 렌더링을 사용할 때 셰이더에 제공되는 컬러와 텍스처는 이미 감마 보정이 된 상태입니다. 해당 컬러와 텍스처를 셰이더에서 사용할 경우 높은 밝기의 컬러는 리니어 라이팅에 비해 실제 컬러가 더 밝게 보입니다. 이는 광원 강도가 높아질수록 해당 표면이 비리니어(non-linear)한 방식으로 밝아진다는 의미입니다. 많은 위치의 광원이 심하게 밝을 수 있으며, 결과적으로 모델과 씬의 컬러가 바래 보일 수 있습니다. 리니어 렌더링을 사용할 경우 표면으로부터의 리스폰스는 광원 강도가 높아질 때도 리니어한 상태를 유지합니다. 이는 더욱 사실적인 표면 셰이딩과 더 나은 표면에서의 컬러 리스폰스를 보여줍니다.

아래의 무한 3D 머리 스캔 이미지는 리니어 조명과 감마 조명에서 인간의 머리 모델이 비춰지는 조명 강도가 어떻게 다른지 보여줍니다.

Lee Perry-Smith의 무한 3D 머리 스캔은 크레이티브 커먼즈 라이선스(CCL) 저작자 표시 3.0 으로부터 라이선스를 받았습니다. (www.ir-ltd.net에서 확인 가능합니다.)
Lee Perry-Smith의 무한 3D 머리 스캔은 크레이티브 커먼즈 라이선스(CCL) 저작자 표시 3.0 으로부터 라이선스를 받았습니다. (www.ir-ltd.net에서 확인 가능합니다.)

리니어(Linear) 블렌딩과 감마 블렌딩

프레임 버퍼로 블렌딩할 때, 블렌딩은 프레임 버퍼의 색 공간에서 이뤄집니다.

감마 공간 렌더링을 사용할 때 비리니어 컬러는 함께 블렌딩됩니다. 이는 컬러를 수학적으로 올바르게 블렌딩 하는 방법이 아니기 때문에 예기치 못한 결과가 발생할 수 있습니다. 하지만 이 방법은 일부 그래픽스 하드웨어에서 블렌딩할 수 있는 유일한 방법입니다.

리니어 공간 렌더링을 사용할 때 리니어 색 공간에서 블렌딩됩니다. 이는 수학적으로 올바른 방법이기 때문에 정확한 결과를 낼 수 있습니다.

아래의 이미지는 블렌딩의 다양한 타입을 보여줍니다.

상단: 리니어 색 공간에서의 블렌딩 결과는 예상하는 결과 그대로입니다.<br/>하단: 감마 색 공간에서의 블렌딩은 결과적으로 채도와 밝기가 과도하게 높습니다
상단: 리니어 색 공간에서의 블렌딩 결과는 예상하는 결과 그대로입니다.
하단: 감마 색 공간에서의 블렌딩은 결과적으로 채도와 밝기가 과도하게 높습니다
리니어 렌더링 개요
리니어 렌더링이 있는 감마 텍스처