헤에.. 앞 글에서 이어집니다.
이제 저 두 옵션을 켜도 문제없이 작동되는 셰이더를 만들려면 뭘 해야 하냐 .
Depth Normal Pass입니다.
이렇게 생긴 Pass가 필요해요 이게 있어야 SSAO도 되고, Decal도 되기 때문에.
요런 Pass가 필요한겁니다.
그래야 SSAO도 되기 때문에 ..
여하간 Pass를 추가해 봅시다.
그리고 Decal 까지 추가하려면.. 일이 좀 큽니다.
설명하려면 글이 길어지네요. 일단 기본형만 올려봅니다.
아래 셰이더는
- Color 패스
- Depth 패스
- Depth Normal 패스
으로 이루어져 있습니다.
Shader "Example/URPUnlitShaderBasic"
{
Properties
{
}
SubShader
{
Tags
{
"RenderType" = "Opaque"
"RenderPipeline" = "UniversalPipeline"
}
Pass //Color패스
{
Name "Unlit"
HLSLPROGRAM
#pragma vertex UnlitPassVertex
#pragma fragment UnlitPassFragment
#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
Varyings UnlitPassVertex(Attributes input)
{
Varyings output = (Varyings)0;
output.positionCS = TransformObjectToHClip(input.positionOS);;
return output;
}
float4 UnlitPassFragment(Varyings input): SV_Target
{
half4 finalColor = float4(0.5,0,0,1);
#ifdef _DBUFFER
ApplyDecalToBaseColor(input.positionCS, finalColor.rgb);
#endif
return finalColor;
}
ENDHLSL
}
Pass //Depth 패스
{
Name "DepthOnly"
Tags
{
"LightMode" = "DepthOnly"
}
ZWrite On
ColorMask R
HLSLPROGRAM
#pragma vertex DepthOnlyVertex
#pragma fragment DepthOnlyFragment
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 position : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
Varyings DepthOnlyVertex(Attributes input)
{
Varyings output = (Varyings)0;
output.positionCS = TransformObjectToHClip(input.position.xyz);
return output;
}
half DepthOnlyFragment(Varyings input) : SV_TARGET
{
return input.positionCS.z;
}
ENDHLSL
}
Pass //Depth Normal 패스
{
Name "DepthNormalsOnly"
Tags
{
"LightMode" = "DepthNormalsOnly"
}
ZWrite On
HLSLPROGRAM
#pragma vertex DepthNormalsVertex
#pragma fragment DepthNormalsFragment
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float3 normal : NORMAL;
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float3 normalWS : TEXCOORD1;
};
Varyings DepthNormalsVertex(Attributes input)
{
Varyings output = (Varyings)0;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.normalWS = NormalizeNormalPerVertex(TransformObjectToWorldNormal(input.normal));
return output;
}
void DepthNormalsFragment(Varyings input, out half4 outNormalWS : SV_Target0
#ifdef _WRITE_RENDERING_LAYERS
, out float4 outRenderingLayers : SV_Target1
#endif
)
{
outNormalWS = half4(NormalizeNormalPerPixel(input.normalWS), 0.0);
#ifdef _WRITE_RENDERING_LAYERS
uint renderingLayers = GetMeshRenderingLayer();
outRenderingLayers = float4(EncodeMeshRenderingLayer(renderingLayers), 0, 0, 0);
#endif
}
ENDHLSL
}
}
}
자 이렇게 하면 SSAO와 Decal까지 모두 적용되는 셰이더가 됩니다.
하하.. 이제 쉽게 쉽게 설명할 수준은 넘어선듯...
반응형
'Shader ' 카테고리의 다른 글
그럼 유니티 6.0의 제대로 된 기본 셰이더 작성법은? (0) | 2024.12.15 |
---|---|
유니티 URP 6.0 에서 기본 셰이더가 안나온다? (0) | 2024.12.15 |
유니티 Lit 셰이더 PBR 뒤져보기3 (2) | 2024.10.23 |
유니티 Lit 셰이더 PBR 뒤져보기2 (0) | 2024.10.10 |
유니티 Lit 셰이더 PBR 뒤져보기 (0) | 2024.10.02 |
댓글