본문 바로가기

프로그래밍/Unity

[Unity] Post Process Stack v2

Unity Particle Pack 의 씬을 이용해 Post Process 를 몇개 적용해 보았다.

아티스트가 아니기에 눈에 띄는 요소들만 확인.





메인카메라에 Post Process Layer 와 Post Process Volume 이 추가되어 있다.

씬 전체에 적용하기 위해 Post Process Volume 의 Is Global 체크되어 있는 상태.





Bloom 

https://docs.unity3d.com/kr/2018.3/Manual/PostProcessing-Bloom.html

Intensity 조정





Threshold 조정



Dirtiness

Texture


지저분함의 강도(intensity)를 조절해 카메라에 얼룩같은 효과를 주게 된다.




Color Grading

https://docs.unity3d.com/kr/2018.3/Manual/PostProcessing-ColorGrading.html

색감을 조절하기 위한 설정

화이트 밸런스 항목의 Temperature 등을 조절해 특정 환경 느낌이 나도록 한다.




Grain

https://docs.unity3d.com/kr/2018.3/Manual/PostProcessing-Grain.html





Lens Distortion





Vinette

https://docs.unity3d.com/kr/2018.3/Manual/PostProcessing-Vignette.html



.

.




커스텀 이펙트 정의

https://github.com/Unity-Technologies/PostProcessing/wiki/Writing-Custom-Effects


쉐이더 정의


Shader "Hidden/MyShader"

{

HLSLINCLUDE

#include "PostProcessing/Shaders/StdLib.hlsl"


TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);

float Blend;


float4 Frag( VaryingsDefault i): SV_Target

{

float4 baseColor = SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, i.textcoord);

float luminance = dot( baseColor.rgb, float3( 0.2126729, 0.7151522, 0.0721750));

color.rgb = lerp( color.rgb, luminance.xxx, Blend.xxx );

return color;

}


ENDHLSL


SubShader

{

Cull Off ZWrite Off ZTest Always


Pass

{

HLSLPROGRAM


#pragma vertex VertDefault

#pragma fragment Frag


ENDHLSL

}

}

}



포스트 프로세스 정의

using UnityEngine.Rendering.PostProcessing;


[System.Serializable]

[PostProcess(typeof( MyRenderer), PostProcessEvent.AfterStack, "Custom/MyRenderer")]


[PostProcess( 렌더 , 인젝션 위치, 메뉴 항목, allowInSceneView = true)]

인젝션 위치

BeforeTransparent : 불투명 오브젝트에만 적용

BeforeStack : 내장 스택 이전에 적용, 안티 앨리어싱, DOF(피사계 심도), 톤 매핑 등

AfterStack : 내장 스택 실행 이후에 적용


public sealed class MyEffectSetting : PostProcessEffectSettings

{

#region Shader Parameters


[Range(0f, 1f), Tooltip("bla~ bla~")]

public FloatParameter blend = new FloatParameter{ value = 0.5f };


#endregion


public override bool IsEnabledAndSupported( PostProcessRenderContext context)

{

return enabled.value && ( blend.value > 0f);

}

}



렌더러



public class MyRenderer : PostProcessEffectRenderer<MyEffectSetting>

{

public override void Render( PostProcessRenderContext context )

{

// PostProcessing/Runtime/PostProcessingContext.cs


var sheet = context.propertySheets.Get( Shader.Find( "Hidden/MyShader" ));


// 쉐이더 프로퍼티에 필요한 값을 지정

sheet.properties.SetFloat( "Blend", settings.blend);


//sheet.properties.SetInt()

//sheet.properties.SetTexture()

//sheet.properties.SetColor()



context.command.BlitFullscreenTriangle( context.source, context.destination, sheet, 0);

}

}




에디터 요소로 설정 추가 : Editor 폴더에 아래 클래스 추가


using UnityEngine.Rendering.PostProcessing;

using UnityEditor.Rendering.PostProcessing;


[PostProcessEditor(typeof(MyRenderer) ) ]

public sealed class MyEffectSettingEditor : PostProcessEffectEditor<MyEffectSetting>

{

SerializedParameterOverride m_Blend;


public override void OnEnable() 

{

m_Blend = FindParameterOverride( x => x.blend );

}


public override void OnInspectorGUI()

{

PropertyField( m_Blend );

}

}

'프로그래밍 > Unity' 카테고리의 다른 글

[Unity] 테셀레이션  (0) 2019.04.05
[Unity] 인스펙터 변수 이름 변경  (0) 2018.11.13
[Unity] SteamVR 액션 설정  (0) 2018.11.05
[Unity] AR Foundation Package  (0) 2018.09.20
[Unity] 유니티용 DLL  (0) 2018.09.18
[Unity] VR 환경 끄거나 켜기  (0) 2018.09.14
[Unity] AssetDatabase  (0) 2018.09.12
[Unity] AssetBundle  (0) 2018.08.24
[unity3d] 서피스 쉐이더 정리  (1) 2018.06.26
[Unity] Mesh 생성 및 변경  (0) 2011.06.24