티스토리 뷰
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
링크