82 lines
2.6 KiB
HLSL
82 lines
2.6 KiB
HLSL
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
|
|
|
|
struct Attributes
|
|
{
|
|
float4 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 color : COLOR;
|
|
float2 uv : TEXCOORD0;
|
|
float3 smoothNormal : TEXCOORD7;
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float2 uv : TEXCOORD0;
|
|
float4 positionCS : SV_POSITION;
|
|
};
|
|
|
|
float GetOutlineWidth(float positionVS_Z)
|
|
{
|
|
float fovFactor = 2.414 / UNITY_MATRIX_P[1].y;
|
|
float z = abs(positionVS_Z * fovFactor);
|
|
|
|
float4 params = _OutlineWidthParams;
|
|
float k = saturate((z - params.x) / (params.y - params.x));
|
|
float width = lerp(params.z, params.w, k);
|
|
|
|
return 0.01 * _OutlineWidth * width;
|
|
}
|
|
|
|
float4 GetOutlinePosition(VertexPositionInputs vertexInput, VertexNormalInputs normalInput, half4 vertexColor)
|
|
{
|
|
float z = vertexInput.positionVS.z;
|
|
float width = GetOutlineWidth(z) * vertexColor.a;
|
|
|
|
half3 normalVS = TransformWorldToViewNormal(normalInput.normalWS);
|
|
normalVS = SafeNormalize(half3(normalVS.xy, 0.0));
|
|
|
|
float3 positionVS = vertexInput.positionVS;
|
|
positionVS += 0.01 * _OutlineZOffset * SafeNormalize(positionVS);
|
|
positionVS += width * normalVS;
|
|
|
|
float4 positionCS = TransformWViewToHClip(positionVS);
|
|
positionCS.xy += _ScreenOffset.zw * positionCS.w;
|
|
|
|
return positionCS;
|
|
}
|
|
|
|
Varyings OutlinePassVertex(Attributes input)
|
|
{
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
|
|
VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);
|
|
|
|
half3x3 tangentToWorld = half3x3(normalInput.tangentWS, normalInput.bitangentWS, normalInput.normalWS);
|
|
half3 normalTS = 2.0 * (input.smoothNormal - 0.5);
|
|
half3 normalWS = TransformTangentToWorld(normalTS, tangentToWorld, true);
|
|
normalInput.normalWS = lerp(normalInput.normalWS, normalWS, _UseSmoothNormal);
|
|
|
|
float4 positionCS = GetOutlinePosition(vertexInput, normalInput, input.color);
|
|
|
|
Varyings output = (Varyings)0;
|
|
output.uv = TRANSFORM_TEX(input.uv, _BaseMap);
|
|
output.positionCS = positionCS;
|
|
|
|
return output;
|
|
}
|
|
|
|
half4 OutlinePassFragment(Varyings input) : SV_TARGET
|
|
{
|
|
half4 lightMap = SAMPLE_TEXTURE2D(_LightMap, sampler_LightMap, input.uv);
|
|
half material = lightMap.a;
|
|
|
|
half4 color = _OutlineColor5;
|
|
color = lerp(color, _OutlineColor4, step(0.2, material));
|
|
color = lerp(color, _OutlineColor3, step(0.4, material));
|
|
color = lerp(color, _OutlineColor2, step(0.6, material));
|
|
color = lerp(color, _OutlineColor, step(0.8, material));
|
|
|
|
return color;
|
|
}
|