105 lines
3.0 KiB
HLSL
105 lines
3.0 KiB
HLSL
#ifndef UNIVERSAL_LIT_INPUT_INCLUDED
|
|
#define UNIVERSAL_LIT_INPUT_INCLUDED
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _BaseMap_ST;
|
|
float4 _BumpMap_ST;
|
|
float4 _MRAE_ST;
|
|
half4 _BaseColor;
|
|
half4 _SpecColor;
|
|
half4 _EmissionColor;
|
|
half4 _EmissionColorA;
|
|
half4 _EmissionColorB;
|
|
half _EmissionIntensity;
|
|
half _Cutoff;
|
|
half _Smoothness;
|
|
half _MinSmoothness;
|
|
half _MaxSmoothness;
|
|
half _Metallic;
|
|
half _BumpScale;
|
|
half _OcclusionStrength;
|
|
half _Surface;
|
|
half _Cull;
|
|
half _ReceiveShadows;
|
|
half _QueueOffset;
|
|
half _SpecularHighlights;
|
|
half _EnvironmentReflections;
|
|
CBUFFER_END
|
|
|
|
TEXTURE2D(_MRAE); SAMPLER(sampler_MRAE);
|
|
|
|
half4 SampleMRAE(float2 uv)
|
|
{
|
|
return SAMPLE_TEXTURE2D(_MRAE, sampler_MRAE, uv);
|
|
}
|
|
|
|
half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha)
|
|
{
|
|
half4 specGloss;
|
|
|
|
half4 mrae = SampleMRAE(uv);
|
|
|
|
#if _SPECULAR_SETUP
|
|
specGloss.rgb = _SpecColor.rgb;
|
|
#else
|
|
specGloss.rgb = half3(mrae.r * _Metallic, 0.0h, 0.0h);
|
|
#endif
|
|
|
|
specGloss.a = saturate(lerp(_MinSmoothness, _MaxSmoothness, mrae.g));
|
|
|
|
return specGloss;
|
|
}
|
|
half SampleOcclusion(float2 uv)
|
|
{
|
|
half4 mrae = SampleMRAE(uv);
|
|
return saturate(LerpWhiteTo(mrae.b, _OcclusionStrength));
|
|
}
|
|
half3 SampleMRAEEmission(float2 uv)
|
|
{
|
|
half4 mrae = SampleMRAE(uv);
|
|
|
|
_EmissionColor.rgb = lerp(_EmissionColorA.rgb, _EmissionColorB.rgb, mrae.a) * _EmissionIntensity;
|
|
|
|
return _EmissionColor.rgb * mrae.a;
|
|
}
|
|
|
|
// 初始化标准PBR表面数据
|
|
void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData)
|
|
{
|
|
half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));
|
|
outSurfaceData.alpha = Alpha(albedoAlpha.a, _BaseColor, _Cutoff);
|
|
|
|
half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a);
|
|
outSurfaceData.albedo = albedoAlpha.rgb * _BaseColor.rgb;
|
|
|
|
#if _SPECULAR_SETUP
|
|
outSurfaceData.metallic = 1.0h;
|
|
outSurfaceData.specular = specGloss.rgb;
|
|
#else
|
|
outSurfaceData.metallic = specGloss.r;
|
|
outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h);
|
|
#endif
|
|
|
|
outSurfaceData.smoothness = specGloss.a;
|
|
outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale);
|
|
outSurfaceData.occlusion = SampleOcclusion(uv);
|
|
|
|
#if defined(_EMISSION)
|
|
half4 mrae = SampleMRAE(uv);
|
|
outSurfaceData.emission = lerp(_EmissionColorA.rgb, _EmissionColorB.rgb, mrae.a) * mrae.a * _EmissionIntensity;
|
|
_EmissionColor.rgb = lerp(_EmissionColorA.rgb, _EmissionColorB.rgb, mrae.a) * _EmissionIntensity;
|
|
#else
|
|
outSurfaceData.emission = half3(0, 0, 0);
|
|
#endif
|
|
|
|
outSurfaceData.clearCoatMask = 0.0h;
|
|
outSurfaceData.clearCoatSmoothness = 0.0h;
|
|
}
|
|
|
|
#endif // UNIVERSAL_LIT_INPUT_INCLUDED
|