티스토리 뷰

728x90

다음은 기본 제공 파이프 라인과 범용 RP의 차이점을 요약 한 것입니다. 주로 셰이더 코드 차이에 중점을 둡니다.

  • Subshader 블록에서“RenderPipeline”=”UniversalPipeline”태그 사용
  • URP는 다음 "LightMode"태그를 사용합니다.
    • UniversalForward – 포워드 렌더러로 개체를 렌더링하는 데 사용됩니다. 
    • ShadowCaster – 그림자 투사에 사용 
    • DepthOnly – 씬 뷰의 깊이 텍스처를 렌더링 할 때 사용되는 것 같지만 게임 내에서는 사용되지 않습니까? 일부 렌더러 기능은이를 사용할 수 있습니다. 
    • Meta – 라이트 맵 베이킹 중에 만 사용 
    • Universal2D – 포워드 렌더러 대신 2D 렌더러가 활성화 된 경우 사용됩니다. 
    • UniversalGBuffer – 지연된 렌더링과 관련됩니다. 나는 이것이 개발 / 테스트 중이라고 생각합니다. URP v10 +?
  • URP는 단일 패스 포워드 렌더링을 사용하므로 지원되는 첫 번째 UniversalForward 패스 만 렌더링됩니다. 태그가 지정되지 않은 다른 패스로 다중 패스 셰이더를 얻을 수 있지만 SRP Batcher를 사용하면 일괄 처리가 중단됩니다. 대신 별도의 MeshRenderer에서 별도의 셰이더 / 머티리얼을 사용하거나 Forward Renderer에서 Render Objects 기능을 사용하는 것이 좋습니다.
  • RenderObjects Forward Renderer 기능은 overrideMaterial을 사용하여 특정 레이어의 개체를 다시 렌더링하는 데 사용할 수 있습니다. (대체 셰이더와 유사하지만 속성 값은 유지되지 않습니다. 재질 속성 블록을 사용하지 않는 한 SRP Batcher로 일괄 처리를 중단하지 않는 한). 기능의 스텐실 및 ztest 값을 재정의 할 수도 있습니다. 사용중인 RenderObjects 기능의 예는 여기를 참조하십시오 (Toon "inverted hull"스타일 외곽선 및 개체 xray / occlusion 효과).
  • 사용자 지정 포워드 렌더러 기능을 작성할 수도 있습니다. 예를 들어 여기에있는 것과 같은 Blit 기능 (Blit.cs 및 BlitPass.cs)을 사용하여 사용자 지정 후 처리 효과를 얻을 수 있습니다. (현재 URP의 postprocess 솔루션에는 사용자 지정 효과가 포함되어 있지 않기 때문)
  • 항상 CG 버전이 아닌 HLSLPROGRAM (또는 HLSLINCLUDE) 및 ENDHLSL을 사용하십시오. 그렇지 않으면 URP ShaderLibrary와 충돌이 발생합니다. 
  • UnityCG.cginc를 포함하는 대신 URP ShaderLibrary를 사용하십시오. 포함 할 주요 항목은 다음과 같습니다.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  • ShaderLibrary에 포함 된 함수에 대한 문서는 실제로 없지만 여기와 여기에서 소스 코드를 참조하십시오. 또한 아래에서 일반적으로 사용되는 몇 가지 사항을 언급하겠습니다.
  • 정점 프로그램 안팎으로 데이터를 전달하는 데 사용되는 구조체는 일반적으로 appdata 및 v2f가 아닌 URP에서 Attributes and Varyings라고합니다. 명명 규칙 일 뿐이며 중요하지 않을 수도 있습니다.
  • 셰이더에는 SRP Batcher와 호환 되려면 UnityPerMaterial CBUFFER가 있어야합니다. (UnityPerDraw도 필요하지만 URP ShaderLibrary가이를 처리합니다). 이 버퍼는 셰이더의 모든 패스에 대해 동일해야하므로 일반적으로 하위 셰이더의 HLSLINCLUDE에 넣는 것이 좋습니다. 셰이더 함수에서 사용할 노출 된 모든 속성을 포함해야합니다. 단, 거기에있을 필요가없는 텍스처는 예외입니다. 예로서 :
Properties {
    _BaseMap ("Example Texture", 2D) = "white" {}
    _BaseColor ("Example Colour", Color) = (0, 0.66, 0.73, 1)
}
...
HLSLINCLUDE
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
 
    CBUFFER_START(UnityPerMaterial)
    float4 _BaseMap_ST;
    float4 _BaseColor;
    // any other properties etc.
    CBUFFER_END
ENDHLSL
  • 위에 표시된 것처럼 _BaseMap은 _MainTex 대신 albedo 텍스처에 사용되는 경향이 있습니다. 대부분 이름 지정 규칙의 차이 일 뿐이며 SurfaceInput.hlsl을 포함하지 않는 한 그다지 중요하지 않습니다. _MainTex는 Blit 사후 처리 및 SpriteRenderer에서 스프라이트를 얻는 데 계속 사용해야합니다.
  • 텍스처와 샘플러를 정의 할 때 다음 매크로를 사용하십시오.
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
  • 텍스처를 샘플링하려면 SAMPLE_TEXTURE2D를 사용하십시오.
half4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
  • TRANSFORM_TEX 매크로도 URP에 포함되어 있습니다.
  • UnityObjectToClipPos가 TransformObjectToHClip으로 대체되었습니다. 그러나 GetVertexPositionInputs를 사용하여 클립 공간 (positionCS), 월드 공간 (positionWS), 뷰 공간 (positionVS) 및 정규화 된 장치 좌표 (positionNDC)에서 위치를 가져올 수도 있습니다. 사용하지 않는 것은 계산되지 않으므로 매우 편리한 기능입니다. 예 :
struct Attributes {
    float4 positionOS   : POSITION;
};
 
struct Varyings {
    float3 positionCS   : SV_POSITION;
    float3 positionWS   : TEXCOORD2;
};
 
Varyings vert(Attributes IN) {
    Varyings OUT;
    VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);
    OUT.positionCS = positionInputs.positionCS;
    OUT.positionWS = positionInputs.positionWS;
    return OUT;
}
  • 마찬가지로, world space 법선 (normalWS)과 world space 탄젠트 (tangentWS) 및 비탄젠트 (bitangentWS)를 얻기위한 GetVertexNormalInputs가 있습니다. normalWS 만 필요한 경우 대신 TransformObjectToWorldNormal을 사용할 수도 있습니다.
VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);
// or, if you just need the normal :
OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS)
  • URP는 surface셰이더를 지원하지 않으므로 vertex/fragment를 작성해야합니다. lighting을 지원하려면 몇 가지 유용한 조명 기능이 포함 된 Lighting.hlsl 파일을 포함 할 수 있습니다.
  • 예를들면 게시물의 조명 소개PBR 조명 섹션을 확인해야합니다.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  • Lighting.hlsl을 사용하여 조명과 그림자를 지원할 때 다음 사항도 포함해야합니다. 이러한 키워드가 정의되지 않은 경우 ShaderLibrary는 계산을 건너 뜁니다.
// Main Light Shadows
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
 
// Additional Lights & Shadows
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
 
// Soft Shadows
#pragma multi_compile _ _SHADOWS_SOFT
 
// Other (Mixed lighting, baked lightmaps, fog)
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fog
 
// Supporting shadows will also require passing a positionWS, 
// and shadowCoord into the fragment shader, again you'll have 
// to see the Lighting sections for actual examples.

 

  • 안개를 처리하려면 ComputeFogFactor 및 MixFog 함수를 사용하세요.
#pragma multi_compile_fog
 
struct Varyings {
    ...
    half fogFactor : TEXCOORD5;
    // or whatever unused texcoord
    // if none are unused pack it together with a half3 or something
}
...
 
// In the vertex shader :
half fogFactor = ComputeFogFactor(positionInputs.positionCS.z);
 
// In the fragment, just before returning the color :
color.rgb = MixFog(color.rgb, IN.fogFactor);

'Unity > Shader' 카테고리의 다른 글

Shader Variants  (0) 2021.03.23
ShadowCaster & DepthOnly Passes  (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
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30