본문 바로가기
카테고리 없음

유니티에서 HDR 컬러 컨트롤 하기

by mati-as 2023. 9. 13.
반응형

서론

유니티 쉐이더에서 COLOR와 HDR COLOR 이렇게 두가지 색상방식으로 컨트롤 할 일이 종종 있으실 겁니다.. HDR은 (High Dynamic Range)의 약자인데, 이름에서 유추되듯, 일반적으로 색상,밟기범위인 0~1 보다 훨씬 높게 조정할 수 있습니다. 이를 통해 매우 밝은색 혹은 포스트 프로세싱 효과와 결합해서 블룸효과를 낼 때 용이하게 사용되기도 합니다.

인스펙터에서는 위 사진처럼 구성되있습니다. 일반적인 RGB화면에 아래 Intensitiy값이 슬라이더 방식으로 조절할 수 있도록 추가 되어 들어가있습니다. 인스펙터 창에서 손쉽게 조절 할 수 있죠.

근데 스크립트로는 어떻게 조절할까요? 제 경험상 난감한 건 스크립트로 조정하려고 했는데도, HDR COLOR 인스턴스를 따로 만들거나 하는 방식이 아니어서 당황했습니다. 그래서 이곳저곳 찾아본 결과..를 사용법 섹션에 설명하겠습니다.

사실 HDR이 "0~1이아닌 큰값을 가질 수 있다" 라는 개념을 가져가시면 생각보다 아래 사용법이 납득이 쉽고 별거 아니었다는 생각이 드실겁니다.

사용법

그럼 어떻게 파라미터를 조작하면서 사용할 수 있을까요? 간단한 예제를 보여드려 보겠습니다.

 

이런식으로 밤이되면 외곽선이 밝아지는 불빛을 만들건데, 처음부터 밝은 외곽선이 아닌, 점차 서서히 밝아지는 방식으로 하고싶다고 가정 해 보겠습니다.

사용법은 매우 간단합니다. 일단 HDR이 아닌 Color 인스턴스를 똑같이 만들고, 이런식으로 구성하면 됩니다.

            if (elapsedTime > waitTime)
            {
                lerpProgress += Time.deltaTime * brightnessIncreasingSpeed; // 진행도 업데이트
                brightness = Mathf.Lerp(minBrightness, maxBrightness, lerpProgress);

                tempColor = inPlayColor * brightness;
                _animalMaterial.SetColor("_emissionColor", tempColor);
            }

다른부분은 무시하시고, 주제와 관련해 중요하게 보실 부분은 TempColor = inPlayColor * brightness; 이부분입니다.

컬러에 단순히 곱셈연산을 한게 보이시나요? 이 부분에 솔루션이 숨어있습니다.inplaycolor에 brigtness를 곱해주는 연산을 좀 더 rgb 각각의 요소로 풀어서 나타내면 (color.r * brigtness, color.g*brigtness, color.b * brigtness, color.a);이렇게 됩니다.

좀 더 정확하게 컨트롤 하기 위해서는 Intensity와 매핑같은게 필요한데.. 그 부분은 잘 모르겠어요 (참고로 color.a는 알파값입니다.더 높은 알파값이라는게 시각적으로는 처리도 안되거니와.. 여기선 무시하되 불필요하게 brigntness를 더하지 않도록 조심하세요. 예기치 않게 값이 바뀔 수 있습니다.)

 

알고보면 참 쉽죠? 각 rgb값에 단순히 brigtness 값만 곱해준 것이죠. 이렇게 brightness값에 lerp를 활용하여 서서히 올라가게 해주면 손쉽게 구현됩니다.. 사실 별거아니죠? 그리고 마지막에 쉐이더 파라미터에 color값을 setcolor(파라미터 이름, 컬러)와 같은 방식으로 대입해주면 끝입니다.

 

혹시나 도움이 됬기를 바랍니다.

반응형