[Shader] Post Processing : Tint Effect
공부용으로 작성되는 페이지입니다. 틀린 부분이나 환경에 따라 오류가 발생할 수 있습니다.
원래 Post Processing 관련 글을 작성하고 있었는데 생각해보니 간단한걸 먼저 만들어보고 진행하는게 좋을 거 같아서 먼저 작성하게되었다.
미리보기 : 최종 결과물
생각했던 것 보다 만들기 너무 힘들었다. 엄밀히 따지자면 Tint shader 자체는 복잡하지 않은데 렌더피쳐랑 너무 오래 싸웠다...
Custom Post Processing : Tint
처음 만들어보는 효과인 만큼 가장 기본적인 효과라고 할 수 있는 Tint 효과를 만들어보려고 한다.
유니티 내장 Post Processing을 살펴보면 Tint는 따로 존재하는 효과가 아니라 Bloom의 Value에 해당한다.
내가 만들 Tint 효과는 간단하게 Color와 Intensity 정도만 있어도 무방할듯하다.
Custom Post Processing - Setting
Post Processing은 Volume 기반으로 적용하는데, custom으로 제작하는 것은 따로 목록에 추가해줘야한다.
//Menu
//It makes you can Add this Effect at 'Add Override'
//
[Serializable, VolumeComponentMenuForRenderPipeline
("PostProcess/CustomPostScreenTint", typeof(UniversalRenderPipeline))]
public class CustomPostScreenTint : VolumeComponent
{
}
이 파트에서 핵심은 VolumeComponentMenuForRenderPipeline 이다.
Unity의 렌더링 파이프라인에 특정 볼륨 컴포넌트를 추가하기 위한 메뉴를 정의해주는 attribute이다.
당연히 지금은 이름뿐이고 아~무 기능도 없다.
일단 앞에서 말한대로 intensity와 Color 파라미터를 추가 작성해주었다.
Tint Shader 작성하기
Tint Shader의 원리 자체는 간단하다. 텍스쳐에 Tint Color 값을 곱하고, intensity로 세기를 조절하는 방식이다.
그래서 비교적 심플하다. Properties에도 텍스쳐만 선언된 상태다.
어차피 뒤에 작성할 렌더피쳐 설정에서 따로 inspector에 노출될 녀석들을 작성해줄것이다.
//Tint effect just needs OverlayColor and Intensity
float4 col = tex2D(_MainTex, i.uv) * _OverlayColor;
col.rgb *= _Intensity;
return col;
어둡게 사용하는게 싫거나 범위를 1내로 한정하고 싶으면 적당히 Lerp나 Saturate를 써줘도 무방하다.
RenderFeature : ScriptableRendererFeature
[Unity] ScriptableRendererFeature 작성하기
공부용으로 작성되는 페이지입니다. 틀린 부분이나 환경에 따라 오류가 발생할 수 있습니다. ScriptableRendererFeature?쉐이더를 작성하면서 ScriptableRendereFeature 부분이 길어져서 따로 작성하게 되었다
hungrykang.tistory.com
가장 악마같은 부분. 이전에 작성해둔 RenderFeature와도 상당히 다르다...
사족이지만 Custom Post Processing을 만드는 과정에서 알게된건데, URP 이전에는 OnRenderImage() 등을 이용해 처리했었다고 한다.
처음 보거나 헷갈리는 개념이 대부분이어서 엄청 애먹었다. 그래도 덕분에 공부는 됐... ^^
- RenderTextureDescriptor : Unity 엔진에서 렌더 텍스처(Render Texture)를 생성할 때 사용되는 구조체
- CommandBuffer : GPU에 보낼 명령 리스트
- Temporary Render Texture : 중간 결과를 저장하거나 렌더 타겟을 안전하게 변경할 수 있도록 사용
- OnCameraSetup : 렌더 타겟을 명시적으로 지정하여 후속 Pass와 충돌이 발생 가능성 방지
특히 OnCameraSetup()이 명시적 렌더 타겟과 무슨 관계인가 싶었는데,
함수의 기능만 봤을 때는 임시 렌더 텍스쳐를 만드는게 전부처럼 보였지만 이 때 렌더 타겟 ID 정보를 받게되고
결국 어떤 타겟에 렌더링할지 미리 GPU에게 알려주는 역할을 해주고 있었다.
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
#RenderTextureDescriptor : Struct of Making Render Texture
RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;
descriptor.depthBufferBits = 0;
#Make Temporary Render Texture
#GetTemporaryRT get _tempHandle.id
#it means _tempHandle is Render Target
cmd.GetTemporaryRT(_tempHandle.id, descriptor, FilterMode.Bilinear);
}
#Work in VolumeManager, 결국 내가 헷갈렸던 이유는 최종적으로 여기서 처리되기 때문이었다.
cmd.Blit(source, _tempHandle.Identifier(), _material);
cmd.Blit(_tempHandle.Identifier(), source);
CameraColorTarget 관련 에러
Upgrading to URP 13 (Unity 2022.1) | Universal RP | 14.0.12
CatDarkGames. Game Dev Story :: Unity 2023-URP 16 렌더피처 API 변경 정리
Unity 2023-URP 16 렌더피처 API 변경 정리
URP 16.0.3 기준, ScriptableRenderFeature & Pass API가 변경되면서 이전 버전 코드를 수정하지 않으면 에러가 발생합니다. 참고자료 https://forum.unity.com/threads/rendertargethandle-is-obsolete-deprecated-in-favor-of-rthandle.1
darkcatgame.tistory.com
URP가 13 부터 ScriptableRenderer API를 사용하는 방법이 변경되어 CameraColorTarget이 더 이상 쓰이지 않게 되었다.
업데이트 된 이후에 RTHandle System API가 도입되어서 참고한 예제 영상과 상이한 부분이 많았다.
그런데 이것도 버전에 따라 있는 함수가 있고 없는 함수가 있으니까 주의해서 사용해야한다.
여태까진 기초 공부를 한다 생각하고 크게 신경쓰지 않았는데 이걸 보니 슬슬 최신 버전으로도 공부를 해야겠단 생각이 든다.
아무튼, URP 13 버전을 쓰시는 분은 RTHandles.Alloc를 사용하자! 나는 URP 12 기준으로 작성했다.
Blit 관련 에러
State comes from an incompatible keyword space
Expected: From shader: 'CustomPostProcessing/ScreenTint' Keyword count: 4 Keywords: STEREO_INSTANCING_ON UNITY_SINGLE_PASS_STEREO STEREO_MULTIVIEW_ON STEREO_CUBEMAP_RENDER_ON
Actual: From shader: 'Hidden/Internal-Loading' ...
cmd.Blit(source, _tempHandle.Identifier(), _material);
cmd.Blit(_tempHandle.Identifier(), source);
cmd 키워드를 추가해서 명시적으로 렌더 타겟을 작성해서 해결되었다.
참고자료
Unity 2023-URP 16 렌더피처 API 변경 정리
URP 16.0.3 기준, ScriptableRenderFeature & Pass API가 변경되면서 이전 버전 코드를 수정하지 않으면 에러가 발생합니다. 참고자료 https://forum.unity.com/threads/rendertargethandle-is-obsolete-deprecated-in-favor-of-rthandle.1
darkcatgame.tistory.com
유니티 포스트 프로세싱 (후처리) 이펙트 만들기 (1)
안녕하세요 마둠파입니다. 한동안 유니티에서 포스트 프로세싱을 만들어볼까 합니다. (다른 할것도 많은데 ...
blog.naver.com
(URP 아님 주의)