写一个用点乘实现的边缘发光shader,用builtin管线
时间: 2024-10-19 12:09:18 浏览: 14
二元扩域ECC点乘算法verilog实现
5星 · 资源好评率100%
要编写一个使用点乘法(Dot Product)实现的边缘发光Shader,我们可以利用Unity的内置Shader系统,例如Standard Shader。以下是简单的实现示例,假设我们想要给物体的边缘添加一个模糊的光照效果:
```glsl
Shader "Custom/EdgeEmitShader"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_EmissionColor ("Emission Color", Color) = (1, 1, 1, 1)
_EdgeStrength ("Edge Strength", Range(0, 1)) = 0.5
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float edgeWeight : COLOR;
};
sampler2D _MainTex;
fixed4 _EmissionColor;
float _EdgeStrength;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
// 计算边缘权重
float ddx = UnityObjectToWorldDerivatives(v.vertex).x;
float ddy = UnityObjectToWorldDerivatives(v.vertex).y;
o.edgeWeight = saturate(length(ddx, ddy));
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// 点乘计算边缘发光效果
float edgeTerm = dot(i.edgeWeight, _EdgeStrength);
fixed4 emitCol = _EmissionColor * edgeTerm;
return lerp(col, emitCol, edgeTerm);
}
ENDCG
}
}
FallBack "Diffuse"
}
```
在这个Shader里,我们首先计算每个像素的边缘权重(即梯度的长度),然后通过点乘运算与边缘强度(_EdgeStrength)相乘,得出边缘区域的发光颜色。最后,我们将原色与边缘光混合,实现边缘发光的效果。
阅读全文