본문 바로가기
Shader

URP 2019 에서 2020으로 업그레이드 할 때 Shader Error

by 대마왕J 2021. 3. 24.

URP 2019 에서 2020으로 업그레이드 할 때 Shader Error

 

URP 7 에서 10으로 업그레이드 할 때 Shader Error가 나는 경우가 있습니다. 

노드로 짜면야 문제가 없지만 코드를 짰을 때, 그것도 기존 내장 인클루드를 같이 이용했을 때 말이죠. 

 

 'InitializeInputData': output parameter 'inputData' not completely initialized at ..

 

이 에러는 

Core.hlsl에 인클루드 되어 있는 Input.hlsl을 사용했을때 나오는 에러인데요 아니 코어를 만들어 쓸 리가 없잖 

이 인풋이 

아래처럼 바뀌었습니다. 뒤에 두 줄이 추가되었어요. 

이게 초기화가 안되어 있다고 나는 에러입니다. 

코드를 보아하니 URP에 아직 안 들어가 있었던 ShadowMask 기능인듯 한데요 URP 10이 되면서 추가되었나 봅니다. 

 

struct InputData
{
    float3  positionWS;
    half3   normalWS;
    half3   viewDirectionWS;
    float4  shadowCoord;
    half    fogCoord;
    half3   vertexLighting;
    half3   bakedGI;
};


struct InputData
{
    float3  positionWS;
    half3   normalWS;
    half3   viewDirectionWS;
    float4  shadowCoord;
    half    fogCoord;
    half3   vertexLighting;
    half3   bakedGI;
    float2  normalizedScreenSpaceUV;
    half4   shadowMask;
};

 

그러므로 이걸 이니셜라이즈 해줬던 코드에서 두 줄을 추가해 주면 됩니다. (혹은 InputData를 커스텀으로 만들어 주거나) 

맨 아래 두 줄이 그겁니다. 

 

void InitializeInputData(Varyings input, half3 normalTS, out InputData inputData)
{
    inputData.positionWS = input.posWS;

#ifdef _NORMALMAP
    half3 viewDirWS = half3(input.normal.w, input.tangent.w, input.bitangent.w);
    inputData.normalWS = TransformTangentToWorld(normalTS,
        half3x3(input.tangent.xyz, input.bitangent.xyz, input.normal.xyz));
#else
    half3 viewDirWS = input.viewDir;
    inputData.normalWS = input.normal;
#endif

    inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS);
    viewDirWS = SafeNormalize(viewDirWS);

    inputData.viewDirectionWS = viewDirWS;

#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
    inputData.shadowCoord = input.shadowCoord;
#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
    inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS);
#else
    inputData.shadowCoord = float4(0, 0, 0, 0);
#endif

    inputData.fogCoord = input.fogFactorAndVertexLight.x;
    inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
    inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS);
    inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
    inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUV);
}

 

일단 여기까지만 하면 에러는 안납니다. 셰도우마스크 기능이 동작하지는 않지만. 

 


그 외 2019 (URP 7)-> 2020 URP (URP 10)셰이더가 바뀐 내역 

기본적으로 셰이더 구조가 상당히 크게 바뀌었습니다. 처음에는 잠깐 못 알아볼 뻔

 

가장 중요한건, SubShader가 하나 더 추가되었다는 겁니다. 

Tag에 보시면, ShaderModel 4.5 인 SubShader와 2.0인  두 개의 SubShader가 있는걸 보실 수 있으실 겁니다. 

4.5는 뭔가 .. 하고 봤더니 

Subshader 4.5 의 패스 구조는 다음과 같습니다. 

Name "ForwardLit"

Name "ShadowCaster"

Name "GBuffer"

Name "DepthOnly"

Name "DepthNormals"

Name "Meta"

Name "Universal2D"

 

그리고 Subshader 2.0 의 패스 구조는 다음과 같습니다. 

Name "ForwardLit"

Name "ShadowCaster"

Name "DepthOnly"

Name "DepthNormals"

Name "Meta"

Name "Universal2D"

 

일단 둘 다 안보이던 DepthNormal Pass가 추가되었습니다. 이것은 유니티에 새로 추가된 SSAO 를 위한 패스로 보입니다. (SSAO는 렌더 피쳐로 추가되었습니다. 거기서 사용할 패스로 보입니다) 

 

그리고 Subshader 4.5 의 패스는, G Buffer 가 보입니다. 저것은 곧 추가될 예정인 URP의 디퍼드 렌더링을 위한 패스로 보입니다. 

 

이게 2019에 있던 URP 7과 2020에 들어간 URP 10의 셰이더 차이입니다.  

URP 8에서는  Subshader 2.0 밖에 없었고, DepthNormals 패스도 없었어요.

그것이 저렇게 추가된 것을 볼 수 있습니다. 

 

 

반응형

'Shader ' 카테고리의 다른 글

InputData  (0) 2021.04.13
#ifndef 이게 뭘까  (0) 2021.04.08
Normal Blending (Detail map)  (2) 2021.02.22
Texcoord. xyzw와 UV1, UV2와의 관계  (1) 2021.02.11
돋보기 효과 만들기  (0) 2021.02.11

댓글