본문 바로가기
Shader

그럼 유니티 6.0의 제대로 된 기본 셰이더 작성법은?

by 대마왕J 2024. 12. 15.

https://chulin28ho.tistory.com/895

 

유니티 URP 6.0 에서 기본 셰이더가 안나온다?

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@12.0/manual/writing-shaders-urp-basic-unlit-structure.html URP unlit basic shader | Universal RP | 12.0.0URP unlit basic shader This example shows a basic URP-compatible shader. This s

chulin28ho.tistory.com

이전 글에서 유니티 기본 셰이더를 작성했을때 안보이는 문제를 해결해 보았습니다. 

그런데 뭔가 껄쩍지근하죠? 

그래요 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 Texture를 언제 그릴까? Depth Prepass / After Opaque

쉽게 설명해주시려고 노력해주신 고정석님께 감사 인사를 드립니다. Depth(깊이) Depth란 .. Z 버퍼라고도 불리던 그것입니다. 게임하면서 깊이값을 알아야 할 때가 있지요? 그게 depth입니다. 이게

chulin28ho.tistory.com

그럼 Depth가 뭔지는 알고 계신다고 치고, 
"Color를 그리면서" "Depth도 그립니다"    로 그리면 별 문제 없이 그려집니다. Depth 그릴때 실패할 뿐 ... Depth도 셰이더에서 Pass를 추가해서 그려야 하거든요... 근데 암 것도 안했으니 실패하지.. 
여하간 그려는 집니다. 그게 여태까지였어요 

대신 그렇게 하면 

이렇게 격자 아래에 그려집니다. 깊이값을 모르니까 대충 막 그리는 거죠. (조금 다르지만 느낌이 그렇다고요 느낌이) 
제대로 깊이를 알고 그린 것 같지 않죠?

Depth Priming Forced (Auto)

근데 Depth Priming을 추가하면 무슨 일이 일어나느냐... 이것도 위의 링크드린 글을 읽으면 잘 써 있습니다만
우선 "Depth도 그립니다"  그게 한 큐예요. 그리고 나서 그려진 Depth를 이용해서 "Color를 그립니다"  이러면 좋은게, 가려져 있는 녀석은 미리 안 그릴 수 있으니 좋습니다.  
즉, 이 방식은 'Depth가 그려져 있지 않으면 Color도 안그립니다' 라는 말이 되는 겁니다.

그런데 처음 소개했던 기본 셰이더는 Depth를 그리는 Pass가 없죠? 그래서 안 그려졌던 것입니다. 

Depth는 이렇게 생겼습니다.

 

그럼 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 에도 적용되는 셰이더는 어떻게 만드는지 보죠. 

 

 

 
반응형

댓글