최신 코드
- URP 쉐이더 코딩 스타일로 변경
- MVP 행렬 변환 코드 분할
Shader "CatDarkGame/URPUnlit"
{
Properties
{
[MainTexture] _BaseMap("Texture", 2D) = "white" {}
[MainColor] _BaseColor("Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType" = "Opaque" "Queue"="Geometry" "RenderPipeline" = "UniversalPipeline" }
LOD 100
Pass
{
Name "URPUnlit"
Tags {"LightMode" = "SRPDefaultUnlit"}
HLSLPROGRAM
#pragma target 4.5
#pragma exclude_renderers gles d3d9
#pragma multi_compile_fog
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
float4 _BaseColor;
CBUFFER_END
TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap);
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float fogFactor : TEXCOORD1;
};
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
float4 positionOS = input.positionOS;
float3 positionWS = TransformObjectToWorld(positionOS.xyz);
float3 positionVS = TransformWorldToView(positionWS);
float4 positionCS = TransformWViewToHClip(positionVS);
output.fogFactor = ComputeFogFactor(positionCS.z);
output.positionCS = positionCS;
output.uv = input.uv;
return output;
}
float4 frag(Varyings input) : SV_Target
{
float2 baseMapUV = input.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw;
float4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, baseMapUV);
float4 finalColor = texColor * _BaseColor;
finalColor.rgb = MixFog(finalColor.rgb, input.fogFactor);
return finalColor;
}
ENDHLSL
}
}
}
이전 공부하면서 작성한 코드
Shader "CatDarkGame/URPUnlit"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
[HDR] _Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Name "URPUnlit"
Tags { "RenderType" = "Opaque" "Queue"="Geometry" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#pragma prefer_hlslcc gles // GLES 2.0 호환
#pragma exclude_renderers d3d11_9x // dx9.0 호환 제거
#pragma multi_compile_fog
#pragma vertex vert
#pragma fragment frag
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float fogCoord : TEXCOORD1;
};
// SRP Batcher
CBUFFER_START(UnityPerMaterial)
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
CBUFFER_END
v2f vert(appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
o.uv = v.uv;
o.fogCoord = ComputeFogFactor(o.vertex.z);
return o;
}
float4 frag(v2f i) : SV_Target
{
float2 mainTexUV = i.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
float4 col = tex2D(_MainTex, mainTexUV) * _Color;
col.rgb = MixFog(col.rgb, i.fogCoord);
return col;
}
ENDHLSL
}
}
}
공부하면서 메모
텍스처 샘플링
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
쉐이더 언어가 HLSL바뀌면서 텍스처와 샘플러 변수를 따로 선언해주게 변경된것 같습니다,
그런데 빌트인에서 사용했던 sampler2D, tex2D를 사용해도 문제 없이 돌아가니 익숙한 방식으로 사용합니다.
CBUFFER_START(UnityPerMaterial) ~ END
SPR Batcher를 사용하기 위한 구문입니다.
Properties의 변수들을 구문안에 넣어서 사용합니다.
SRP Batcher의 원리는 마테리얼의 변수 데이터를 GPU 메모리의 CBUFFER에 올려서 관리합니다.
다른 오브젝트, 마테리얼이더라도 동일한 쉐이더에 CBUFFER에 올라간 변수만 같다면 SRP Batcher가 동작합니다.
(파티클, Skined Mesh에는 동작하지 않습니다.)
SRP Batcher 지원 하드웨어
쉐이더가 SRP Batcher 호환하는지 확인하는 방법
새로운 전처리 코드
URP 쉐이더 코드 자료 찾으면서 공통적으로 들어가 있는 전처리 코드가 있습니다.
#pragma prefer_hlslcc gles
- OpenGLES 2.0을 호환할려면 이 코드를 써야하는 것 같습니다.(테스트 안해봄)
- HLSL Cross Complier를 통해 쉐이더 코드를 GLES 코드로 변환하고 최적화된다고 합니다.
#pragma exclude_renderers d3d11_9x
- DX9.0을 호환하지 않습니다.
참고 자료
https://forum.unity.com/threads/shader-compile-pipe-in-lightweight-rendepipeline.541809/
https://blog.unity.com/kr/technology/srp-batcher-speed-up-your-rendering
https://mathmakeworld.tistory.com/64
'Unity' 카테고리의 다른 글
AI Skybox Generator (0) | 2023.04.03 |
---|---|
Unity Hub 에디터 커맨드 라인 인자 - 특정 그래픽 API로 에디터 실행 (0) | 2023.03.07 |
TextMeshPro - BitmapFont Shadow (0) | 2022.11.21 |
[Unity] 블루스택으로 유니티 프로파일링하기 (1) | 2022.05.18 |
Shader Graph 에디터 에러 발생시 해결법 (0) | 2021.12.01 |
WRITTEN BY
- CatDarkGame
Technical Artist dhwlgn12@gmail.com