第一个成品shader,纪念一下。
看看效果
用了2个Pass,一个画外描边,一个画主颜色。模型是在原神官网下的。质量真不错。
下面是代码。初学 请多指教
Shader "Unlit/study02_Toon"
{
Properties
{
_MainTex ("Main Tex", 2D) = "white" {}
_MainColor ("Main Color", Color) = (1,1,1,1)
_OutLine ("Out Line Color", Color) = (1,1,1,1)
_OutLineOffset ("Out Line Offset",float) = 1
_ShadowColor("ShadowColor",Color) = (0,0,0,0)
_ShadowRange1("ShadowRange1",float) = 1
_ShadowRange2("ShadowRange2",float) = 1
}
SubShader
{
Tags
{
"RenderPipeline"="UniversalRenderPipeline"
}
//OutLine 描边Pass
Pass
{
Tags
{
"LightMode" = "SRPDefaultUnlit"
}
Cull Front
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
//模型->顶点
struct a2v
{
float4 pos : POSITION;
float4 nor : NORMAL;
};
//顶点->片元
struct v2f
{
float4 pos: POSITION;
float4 nor: NORMALE;
};
CBUFFER_START(UnityPerMaterial)
half4 _OutLine;
float _OutLineOffset;
float _IsOpenOutLine;
CBUFFER_END
v2f vert(a2v In)
{
v2f Out;
float3 data = In.pos + In.nor * (_OutLineOffset/100000);
Out.pos = TransformObjectToHClip(data);
Out.nor = -In.nor;
return Out;
}
half4 frag(v2f In): SV_Target
{
half4 Out = _OutLine;
return Out;
}
ENDHLSL
}
//Main 主颜色Pass
Pass
{
Tags
{
"LightMode" = "UniversalForward"
}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
//模型->顶点
struct a2v
{
float4 pos : POSITION;
float4 nor : NORMAL;
float2 uv : TEXCOORD0;
};
//顶点->片元
struct v2f
{
float4 pos: POSITION;
float4 nor: NORMAL;
float2 uv : TEXCOORD0;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
float4 _MainColor;
float4 _ShadowColor;
float _ShadowRange1;
float _ShadowRange2;
CBUFFER_END
v2f vert(a2v In)
{
v2f Out;
Out.pos = TransformObjectToHClip(In.pos);
Out.nor = In.nor;
Out.uv = TRANSFORM_TEX(In.uv, _MainTex);
return Out;
}
void GetLightDirAndColor(out float3 direction, out float3 color)
{
#if SHADERGRAPH_PREVIEW
direction = half3(0.5,0.5,0);
color=1;
#else
Light light = GetMainLight();
direction = light.direction;
color = light.color;
#endif
}
half4 frag(v2f In): SV_Target
{
half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, In.uv);
float3 lightDir;
float3 lightColor;
GetLightDirAndColor(lightDir, lightColor);
float4 shadowDir = dot(In.nor, -lightDir);
float4 shadowSmoOver = smoothstep(_ShadowRange1, _ShadowRange2, shadowDir);
float4 shadowData = saturate(shadowSmoOver + _ShadowColor);
half4 Out = col + _MainColor;
return Out * shadowData;
}
ENDHLSL
}
}
}
欢迎提出修改意见!一起学习一起进步!