https://chulin28ho.tistory.com/895
이전 글에서 유니티 기본 셰이더를 작성했을때 안보이는 문제를 해결해 보았습니다.
그런데 뭔가 껄쩍지근하죠?
그래요 Depth Priming모드가 뭔지는 몰라도 이걸 Disabled 하면 된다는데,
아니 뭐 보이는 것은 좋다 쳐도 ..
일단 이렇잖아요. 뭔가 격자의 아래에 있어!
즉 뭐랄까 - 제대로 만든게 아니라는 느낌 이랄까 .. 대충 적당히 만들었달까.. 그런 기분이 나잖아요?
그래서 이번엔 제대로 만들려면 어떻게 해야 하는 건가요? 라는 겁니다.
Depth Priming 모드에서 안나오는 이유
일단, Depth Priming 을 Disabled로 하면 보이고 Auto나 Forced 로 하면 안보이는 이유부터 알아봅시다.
Depth Priming Disabled
Depth Priming Mode를 Disabled로 하면, "Color를 그리면서" "Depth도 그립니다"
Depth (일명 Depth Buffer)가 뭔지 모르신다면 아래부터 보고 오세요.
https://chulin28ho.tistory.com/777
그럼 Depth가 뭔지는 알고 계신다고 치고,
"Color를 그리면서" "Depth도 그립니다" 로 그리면 별 문제 없이 그려집니다. Depth 그릴때 실패할 뿐 ... Depth도 셰이더에서 Pass를 추가해서 그려야 하거든요... 근데 암 것도 안했으니 실패하지..
여하간 그려는 집니다. 그게 여태까지였어요
대신 그렇게 하면
이렇게 격자 아래에 그려집니다. 깊이값을 모르니까 대충 막 그리는 거죠. (조금 다르지만 느낌이 그렇다고요 느낌이)
제대로 깊이를 알고 그린 것 같지 않죠?
Depth Priming Forced (Auto)
근데 Depth Priming을 추가하면 무슨 일이 일어나느냐... 이것도 위의 링크드린 글을 읽으면 잘 써 있습니다만
우선 "Depth도 그립니다" 그게 한 큐예요. 그리고 나서 그려진 Depth를 이용해서 "Color를 그립니다" 이러면 좋은게, 가려져 있는 녀석은 미리 안 그릴 수 있으니 좋습니다.
즉, 이 방식은 'Depth가 그려져 있지 않으면 Color도 안그립니다' 라는 말이 되는 겁니다.
그런데 처음 소개했던 기본 셰이더는 Depth를 그리는 Pass가 없죠? 그래서 안 그려졌던 것입니다.
그럼 Depth를 추가하면 그려지겠네요?
물론 그렇습니다!
그러니까 기본 셰이더를 작성할때, Depth Pass를 추가하면 되겠네요!!!
자 소개합니다. Depth Pass가 추가된 기본셰이더입니다.
Shader "Example/URPUnlitShaderBasic"
{
Properties
{ }
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag() : SV_Target
{
half4 customColor = half4(0.5, 0, 0, 1);
return customColor;
}
ENDHLSL
}
Pass
{
Name "DepthOnly"
Tags
{
"LightMode" = "DepthOnly"
}
// -------------------------------------
// Render State Commands
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
}
}
}
자아, Depth를 추가했습니다. 이제 되었겠죠?
안나와요
???? 왜????
이걸로 안끝났습니다.
애석하게도 이걸로 안 끝났습니다 캬하하하하하하
여기 Setting쪽 다시 보세요
어떻게 씬을 만들었냐에 따라 다를 순 있는데, 보통은 아무 생각 없이 아래처럼 URP Standard로 생성했다면 안나오는게 정상입니다.
여기서 PC_High_Renderer 에서
아래 이 렌더피쳐 때문입니다.
얘들도 필요한 Pass가 있고, 그 Pass가 없으면 안그려지거든요.
SSAO와 Decal이군요.. 딱 보면 .. 이녀석들이 필요한 Pass는 ... Depth Normal Passs겠지요????
여하간 일단 저녀석들을 꺼줘 봅시다. (마지막의 Fullscreen Mask 는 안꺼도 됩니다)
그렇게 꺼 주면..
짜잔.. 이번에는 Depth도 잘 .. 피해서 그려집니다.
그럼 다음 글은 뭔지 알겠죠? SSAO와 Decal 에도 적용되는 셰이더는 어떻게 만드는지 보죠.
'Shader ' 카테고리의 다른 글
SSAO와 Decal 까지 적용되는 풀버전 기본셰이더 만들기 (3) | 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 |
댓글