项目要求一个文本自发光的效果,网上搜索了一下法线并没有找到有关代码,于是只能自己动手写了一个,先上效果吧
这里其实只用到了简单的模糊效果,本来想用的高斯模糊,但是发现效果还不如简单的模糊效果。下面是片元着色器的代码
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循环,就只能如此了,例子这里是取了每点周围五个像素作为源色彩,求得均值作为当前像素色彩。