最近有一个动态创建模型的项目,使用代码读取数据源从而创建出模型,真的是折腾的欲仙欲死,不过最近还终于折腾出来了,但是表现还不是太好,在项目中由于所有的模型都是代码动态创建的,没有纹理也没有分配UV,所以最终出的模型没有层次感,使用光照消耗太大,所以就有了shader的需求,我的做法是借助菲涅尔反射的方法。
效果图:
![默认材质(无光)](https://i-blog.csdnimg.cn/blog_migrate/0de49324480fabe8864ae22a7eae675f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/fc31002839e4f58c250781d158ee4485.jpeg)
源码:
Shader "SepShader/S_VertsFresnel"
{
Properties
{
_defaultCol("_defaultCol", Color) = (1,1,1,1)
//_fresnelCol("_fresnelCol", Color) = (0,0,0,1)
}
SubShader
{
Tags{ "RenderType"="Opaque" "Queue" = "Geometry+1" }
LOD 100
Pass
{
//tags{ "lightmode=" = "forward" }
Cull Back //剔除后面
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex1 : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed3 color : COLOR;
};
fixed3 _defaultCol;
//float4 _fresnelCol;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex1);
//将法线转到世界坐标
fixed3 worldN = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
fixed3 worldV = normalize(WorldSpaceViewDir(v.vertex1));
o.color = _defaultCol * saturate(dot(worldN, worldV));
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return fixed4(i.color,1.0);
}
ENDCG
}
}
}
注:该shader仅适合特殊需要的项目