티스토리 뷰
ShadowCaster
셰이더가 그림자를 드리우려면 "LightMode"= "ShadowCaster"태그가 있는 패스가 필요합니다. Unlit 셰이더와 Lit 셰이더 모두 이 작업을 수행 할 수 있지만 그림자를 드리우는 동안 UniversalForward 패스에서 처리하지 않는 한 그림자를 받지 않습니다.
셰이더에는 "LightMode"= "DepthOnly"태그가 지정된 패스도 포함되어야합니다. 이 패스는 ShadowCaster와 매우 유사하지만 그림자 bias offset이 없습니다. URP에서 DepthOnly 패스가 무엇에 사용되는지 완전히 잘 모르겠습니다. 씬 뷰는 (셰이더 그래프의 씬 뎁스 노드에서 사용되는) 뎁스 텍스처를 렌더링 할 때 이것을 사용하는 것 같지만, 게임 뷰 뎁스 텍스처는 이 패스없이 잘 작동하는 것 같습니다. 하지만 DepthOnly 패스에 의존하는 커스텀렌더기능 (포워드 렌더러 용)과 같은 다른 것들이 있을 수 있습니다.
셰이더의 모든 패스와 마찬가지로 셰이더가 SRP Batcher와 호환되도록하려면 동일한 UnityPerMaterial CBUFFER를 공유해야합니다. 이 게시물의 이전 섹션에서는 셰이더의 모든 패스에 자동으로 사용되도록 HLSLINCLUDE 내부에 버퍼를 넣었습니다.
Shaderlab 섹션에서 다시 논의한 UsePass를 사용하는 경우는 예외입니다. 다른 셰이더의 그림자 캐스터를 사용할 수는 있지만 UsePass "UniversalRenderPipeline/Lit/ShadowCaster", SRP Batcher 호환성은 해당 셰이더에서 사용되는 CBUFFER가 다를 수 있으므로 손실 될 수 있습니다.
대신 이러한 패스를 직접 정의해야하지만 약간의 해결 방법으로 다음을 수행 할 수 있습니다.
Pass {
Name "ShadowCaster"
Tags { "LightMode"="ShadowCaster" }
ZWrite On
ZTest LEqual
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x gles
//#pragma target 4.5
// Material Keywords
#pragma shader_feature _ALPHATEST_ON
#pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma vertex ShadowPassVertex
#pragma fragment ShadowPassFragment
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
ENDHLSL
}
Unity가 URP 셰이더에 사용하는 ShadowCasterPass를 사용하면 패스를 정의하는 것이 조금 더 쉬워 지지만 _BaseMap, _BaseColor 및 _Cutoff 속성을 사용해야하며 UnityPerMaterial CBUFFER에도 추가해야합니다.
그림자 캐스터의 fragment함수는 그림자가 있어야하는 곳에 0을 반환하고 그림자가 없어야하는 픽셀을 버립니다. (참고 : 클리핑은 _ALPHATEST_ON 키워드가 활성화 된 경우에만 발생 함)
일반 셰이더 패스도 버텍스 displacement를 수행하는 경우, 이것은 displace된 그림자를 올바르게 투사하도록 ShadowCaster 패스에도 추가해야합니다. 이를 처리하려면 ShadowCasterPass의 내용을 패스에 복사하거나 새 정점 함수를 정의하고 #pragma 정점 ShadowPassVertex를 교체해야합니다. 예 :
#pragma vertex vert
...
// function copied from ShadowCasterPass and edited slightly.
Varyings vert(Attributes input) {
Varyings output;
UNITY_SETUP_INSTANCE_ID(input);
// Example Displacement
input.positionOS += float4(0, _SinTime.y, 0, 0);
output.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);
output.positionCS = GetShadowPositionHClip(input);
return output;
}
DEPTHONLY
몇 가지 사소한 차이를 제외하고 비슷한 방식으로 DepthOnly 패스를 처리 할 수 있습니다.
Pass {
Name "DepthOnly"
Tags { "LightMode"="DepthOnly" }
ZWrite On
ColorMask 0
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x gles
//#pragma target 4.5
// Material Keywords
#pragma shader_feature _ALPHATEST_ON
#pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma vertex DepthOnlyVertex
#pragma fragment DepthOnlyFragment
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
// Again, using this means we also need _BaseMap, _BaseColor and _Cutoff shader properties
// Also including them in cbuffer, except _BaseMap as it's a texture.
// 다시 말하지만, 이것을 사용하면 _BaseMap, _BaseColor 및 _Cutoff 셰이더 속성도 필요합니다.
// 텍스처이므로 _BaseMap을 제외하고 cbuffer에 포함합니다.
ENDHLSL
}
이번에는 Unity의 URP 셰이더에서 제공하는 DepthOnlyPass를 사용합니다. 다시 말하지만, 정점 변위가 필요한 경우 DepthOnlyVertex 함수를 코드에 복사하고 이름을 vert로 변경 한 다음 위의 ShadowCaster 예제와 같이 변위 코드를 추가해야합니다.
'Unity > Shader' 카테고리의 다른 글
Shader Variants (0) | 2021.03.23 |
---|---|
Summary of Built-in vs URP differences (0) | 2021.01.25 |
PBR Lighting (0) | 2021.01.25 |
Lighting Introduction (0) | 2021.01.22 |
Keywords & Shader Variants (0) | 2021.01.22 |
- Total
- Today
- Yesterday