项目要求一个文本自发光的效果,网上搜索了一下法线并没有找到有关代码,于是只能自己动手写了一个,先上效果吧
这里其实只用到了简单的模糊效果,本来想用的高斯模糊,但是发现效果还不如简单的模糊效果。下面是片元着色器的代码
float getTransparent(sampler2D MainTex, float2 uv)
{
fixed4 result = tex2D(_MainTex, uv);
return result.a;
}
</pre><p></p><p><pre name="code" class="cpp">fixed4 frag (v2f i) : COLOR
{
fixed4 lightCol = fixed4(0.0f, 0.612f, 1.0f, 1.0f);
fixed4 result = tex2D(_MainTex,i.uv);
float accAlpha = 0;
float offsetValue = _OffsetValue;
int lev = 7;
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -7));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -6));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -5));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -4));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -3));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -2));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, -1));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 0));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 1));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 2));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 3));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 4));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 5));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 6));
++lie;
}
for(int lie = 0 - lev; lie <= lev;)
{
accAlpha = accAlpha + getTransparent(_MainTex, i.uv + offsetValue*float2(lie, 7));
++lie;
}
fixed4 col = 1*result.a + lightCol.rgba*(1.0f - result.a);
col.a = result.a + accAlpha/(float)((2*lev+1)*(2*lev+1));
col.a = col.a*(col.a + 1);
return col;
}
unity的shader貌似不能嵌套for循环,就只能如此了,例子这里是取了每点周围五个像素作为源色彩,求得均值作为当前像素色彩。