unity不用插件怎么做unity3d 模型导出插件外发光

下次自动登录
现在的位置:
& 综合 & 正文
【Unity3D自学记录】 Unity3D Shader之外发光材质
Shader "Faye/OutLightting"
Properties
_MainTex("Texture (RGB)", 2D) = "black" {}
_Color("Color", Color) = (0, 0, 0, 1)
_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
_Size("Size", Float) = 0.1
_Falloff("Falloff", Float) = 5
_FalloffPlanet("Falloff Planet", Float) = 5
_Transparency("Transparency", Float) = 15
_TransparencyPlanet("Transparency Planet", Float) = 1
Name "PlanetBase"
Tags {"LightMode" = "Always"}
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform sampler2D _MainT
uniform float4 _MainTex_ST;
uniform float4 _C
uniform float4 _AtmoC
uniform float _FalloffP
uniform float _TransparencyP
struct v2f
float4 pos : SV_POSITION;
float3 normal : TEXCOORD0;
float3 worldvertpos : TEXCOORD1;
float2 texcoord : TEXCOORD2;
v2f vert(appdata_base v)
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.normal = v.
o.worldvertpos = mul(_Object2World, v.vertex).
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
float4 frag(v2f i) : COLOR
i.normal = normalize(i.normal);
float3 viewdir = normalize(_WorldSpaceCameraPos-i.worldvertpos);
float4 atmo = _AtmoC
atmo.a = pow(1.0-saturate(dot(viewdir, i.normal)), _FalloffPlanet);
atmo.a *= _TransparencyPlanet*_C
float4 color = tex2D(_MainTex, i.texcoord)*_C
color.rgb = lerp(color.rgb, atmo.rgb, atmo.a);
return color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
Name "AtmosphereBase"
Tags {"LightMode" = "Always"}
Cull Front
Blend SrcAlpha One
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform float4 _C
uniform float4 _AtmoC
uniform float _S
uniform float _F
uniform float _T
struct v2f
float4 pos : SV_POSITION;
float3 normal : TEXCOORD0;
float3 worldvertpos : TEXCOORD1;
v2f vert(appdata_base v)
v.vertex.xyz += v.normal*_S
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.normal = v.
o.worldvertpos = mul(_Object2World, v.vertex);
float4 frag(v2f i) : COLOR
i.normal = normalize(i.normal);
float3 viewdir = normalize(i.worldvertpos-_WorldSpaceCameraPos);
float4 color = _AtmoC
color.a = pow(saturate(dot(viewdir, i.normal)), _Falloff);
color.a *= _Transparency*_Color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
FallBack "Diffuse"
&&&&推荐文章:
【上篇】【下篇】【风宇冲】Unity3D教程宝典之Shader篇:第二十五讲描边及外发光
原创文章如需转载请注明:转载自
Shader第二十五讲:描边及外发光
描边以及外发光一般有如下几种实现方法:
【一贴图加工】
直接在贴图上对应模型边缘的位置画描边,凹的地方画阴影轮廓,凸起的地方画高光。
(1)效率高,对渲染效率没有增加任何负担。
(2)画风可个性化。充分满足定制的需求。
(1)这种方法需要考虑视角光线的属性。
阴影高亮:&
& 需要物体面和光源的相对关系不变。 &
& 对于棱角分明的物体(如立方体,风车) 可任意使用。因为边缘固定。
对于棱角不分明的物体(如球体人物等)需要物体面和相机的相对视角稳定。因为边缘和观察角度有关。
(2)增加工作量
《武士》《武士II》
【二 法线与视线计算】(Rim Lighting)
正常来说,物体法线与视线(从顶点至相机的方向)角度越一致,就越是能被玩家看见的中间。而边缘一般与法线垂直。由点乘即可计算轮廓光。
half rim =
- saturate(dot (normalize(IN.viewDir), o.Normal));
(1)实现简单,对渲染效率增加负担极小。
(2)有渐变,较真实。
(1)只适用于法线较均匀过度的模型。而不适用于棱角分明的物体,如上图中的立方体,故使用范围与贴图加工刚好相反。
《零世界》
"Example/Rim"
Properties
_MainTex ("Texture",
_BumpMap ("Bumpmap",
_RimColor ("Rim
Color) = (0.26,0.19,0.16,0.0)
_RimPower ("Rim
Range(0.5,8.0))
"RenderType"
#pragma surface surf
surf (Input IN, inout SurfaceOutput o) {
o.Albedo =
tex2D (_MainTex, IN.uv_MainTex).
o.Normal =
UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
half rim =
- saturate(dot (normalize(IN.viewDir), o.Normal));
//saturate
限制值于[0,1]之间
o.Emission =
_RimColor.rgb * pow (rim, _RimPower);
【三法线外拓】
也有叫挤出的
用2个Pass 渲染物体2次,
第一遍:描边,顶点沿法线方向外拓。
第二遍:正常渲染物体
(1)效果最好。
(2)适用范围广。
(1)对效率有一定影响。因为有2个Pass,所以DrawCall为正常的2倍
(2)对于法线过度不均匀的模型。轮廓会有缝隙,如上图立方体的左上角和右上角。
《变身吧 主公》
Shader&"Toon/Basic&Outline"&{
&&Properties&{
&&_Color&("Main&Color",&Color)&=&(.5,.5,.5,1)
&&_OutlineColor&("Outline&Color",&Color)&=&(0,0,0,1)
&&_Outline&("Outline&width",&Range&(.002,&0.03))&=&.005
&&_MainTex&("Base&(RGB)",&2D)&=&"white"&{&}
&&_ToonShade&("ToonShader&Cubemap(RGB)",&CUBE)&=&""&{&Texgen&CubeNormal&}
&&CGINCLUDE
&&#include&"UnityCG.cginc"
&&struct&appdata&{
&&float4&vertex&:&POSITION;
&&float3&normal&:&NORMAL;
&&struct&v2f&{
&&float4&pos&:&POSITION;
&&float4&color&:&COLOR;
&&uniform&float&_Outline;
&&uniform&float4&_OutlineColor;
&&v2f&vert(appdata&v)&{
&&o.pos&=&mul(UNITY_MATRIX_MVP,&v.vertex);
&&float3&norm&&&=&mul&((float3x3)UNITY_MATRIX_IT_MV,&v.normal);
&&float2&offset&=&TransformViewToProjection(norm.xy);
&&o.pos.xy&+=&offset&*&o.pos.z&*&_Outline;
&&o.color&=&_OutlineColor;
&&return&o;
&&SubShader&{
&&Tags&{&"RenderType"="Opaque"&}
&&UsePass&"Toon/Basic/BASE"
&&Name&"OUTLINE"
&&Tags&{&"LightMode"&=&"Always"&}
&&Cull&Front
&&ZWrite&On
&&ColorMask&RGB
&&Blend&SrcAlpha&OneMinusSrcAlpha
&&CGPROGRAM
&&#pragma&vertex&vert
&&#pragma&fragment&frag
&&half4&frag(v2f&i)&:COLOR&{&return&i.color;&}
&&SubShader&{
&&Tags&{&"RenderType"="Opaque"&}
&&UsePass&"Toon/Basic/BASE"
&&Name&"OUTLINE"
&&Tags&{&"LightMode"&=&"Always"&}
&&Cull&Front
&&ZWrite&On
&&ColorMask&RGB
&&Blend&SrcAlpha&OneMinusSrcAlpha
&&CGPROGRAM
&&#pragma&vertex&vert
&&#pragma&exclude_renderers&shaderonly
&&SetTexture&[_MainTex]&{&combine&primary&}
&&Fallback&"Toon/Basic"
使用offset指令,这种方法能够避免法线外拓方法中产生的法线过渡不均匀的问题,但同时会产生新的问题,将普通物体置于其和相机之间有时候会,产生显示错误,如右下图的小黑点漏出。
&&&&&&&&&&&&&&&&&&&&&&&&&
Shader&"Custom/Cartoon_Offset"&{
&Properties&{
&_MainTex&("Texture",&2D)&=&"white"&{&}
&SubShader
& &Cull&front
& &offset&-5,-1
& &CGPROGRAM
& &#pragma&vertex&vert
& &#pragma&fragment&frag
& &#include&"UnityCG.cginc"
& &sampler2D&_MainTex;
& &float4&_MainTex_ST;
& &struct&v2f&{
&float4&&pos&:&SV_POSITION;
&float2&&uv&:&TEXCOORD0;
& &v2f&vert&(appdata_base&v)
&o.pos&=&mul(UNITY_MATRIX_MVP,v.vertex);
&o.uv&=&TRANSFORM_TEX(v.texcoord,_MainTex);
&return&o;
& &float4&frag&(v2f&i)&:&COLOR
&return&float4(0,0,0,0);
&//绘制物体
& &offset&2,-1
& &CGPROGRAM
& &#pragma&vertex&vert
& &#pragma&fragment&frag
& &#include&"UnityCG.cginc"
& &sampler2D&_MainTex;
& &float4&_MainTex_ST;
& &struct&v2f&{
&float4&&pos&:&SV_POSITION;
&float2&&uv&:&TEXCOORD0;
& &v2f&vert&(appdata_base&v)
&o.pos&=&mul(UNITY_MATRIX_MVP,v.vertex);
&o.uv&=&TRANSFORM_TEX(v.texcoord,_MainTex);
&return&o;
& &float4&frag&(v2f&i)&:&COLOR
&float4&texCol&=&tex2D(_MainTex,i.uv);
&float4&outp&=&texCol;
&return&outp;
【五描边加光照】
二 :光的特殊处理:光的离散化
主要就两句代码
//***&漫反射光离散化&***
diffuseF&=&floor(diffuseF*&_DiffuseStep)/_DiffuseStep;
//***&镜面反射光离散化&***
specF&=&floor(specF*&_SpecFacStep)/_SpecFacStep;
Shader&"Custom/mylightCartoon"&{
&Properties&{
&_OutlineColor&("Outline&Color",&Color)&=&(0,0,0,1)
&_Outline&("Outline&width",&Range&(.002,&0.03))&=&.005
&_MainTex&("Base&(RGB)",&2D)&=&"white"&{&}
&_DiffuseStep("_DiffuseStep&0.1-3",Range(0.1,3))&=&0.5
&_SpecFacStep("_SpecFacStep&0.1-3",Range(0.1,3))&=&0.5
&SubShader
&&Name&"OUTLINE"
& &Tags&{&"LightMode"&=&"Always"}
& &Cull&front
& &CGPROGRAM
& &#pragma&vertex&vert
& &#pragma&fragment&frag
& &#include&"UnityCG.cginc"
& &sampler2D&_MainTex;
& &float4&_MainTex_ST;
&&uniform&float&_Outline;
&uniform&float4&_OutlineColor;
&struct&v2f&{
&float4&pos&:&POSITION;
&float4&color&:&COLOR;
& &v2f&vert&(appdata_full&v)
&o.pos&=&mul(UNITY_MATRIX_MVP,&v.vertex);
&float3&norm&&&=&mul&((float3x3)UNITY_MATRIX_IT_MV,&v.normal);
&float2&offset&=&TransformViewToProjection(norm.xy);
&o.pos.xy&+=&offset&*&o.pos.z&*&_Outline;
&o.color&=&_OutlineColor;
&return&o;
& &float4&frag&(v2f&i)&:&COLOR
&return&i.color;
& &tags{"LightMode"="Vertex"}
& &CGPROGRAM
& &#pragma&vertex&vert
& &#pragma&fragment&frag
& &#include&"UnityCG.cginc"
& &#include&"Lighting.cginc"
& &sampler2D&_MainTex;
& &float4&_MainTex_ST;
& &float&_DiffuseStep;
& &float&_SpecFacStep;
& &struct&v2f&{
&float4&&pos&:&SV_POSITION;
&float2&&uv&:&TEXCOORD0;
&float3&normal:TEXCOORD1;
&float3&lightDir:TEXCOORD2;
&float&atten:TEXCOORD3;
&float3&viewDir:TEXCOORD4;
& &float4x4&inverse(float4x4&input)
&#define&minor(a,b,c)&determinant(float3x3(input.a,&input.b,&input.c))
&//determinant(float3x3(input._22_23_23,&input._32_33_34,&input._42_43_44))
&float4x4&cofactors&=&float4x4(
&&minor(_22_23_24,&_32_33_34,&_42_43_44),&
&-minor(_21_23_24,&_31_33_34,&_41_43_44),
&&minor(_21_22_24,&_31_32_34,&_41_42_44),
&-minor(_21_22_23,&_31_32_33,&_41_42_43),
&-minor(_12_13_14,&_32_33_34,&_42_43_44),
&&minor(_11_13_14,&_31_33_34,&_41_43_44),
&-minor(_11_12_14,&_31_32_34,&_41_42_44),
&&minor(_11_12_13,&_31_32_33,&_41_42_43),
&&minor(_12_13_14,&_22_23_24,&_42_43_44),
&-minor(_11_13_14,&_21_23_24,&_41_43_44),
&&minor(_11_12_14,&_21_22_24,&_41_42_44),
&-minor(_11_12_13,&_21_22_23,&_41_42_43),
&-minor(_12_13_14,&_22_23_24,&_32_33_34),
&&minor(_11_13_14,&_21_23_24,&_31_33_34),
&-minor(_11_12_14,&_21_22_24,&_31_32_34),
&&minor(_11_12_13,&_21_22_23,&_31_32_33)
&#undef&minor
&return&transpose(cofactors)&/&determinant(input);
& &v2f&vert&(appdata_full&v)
&o.pos&=&mul(UNITY_MATRIX_MVP,v.vertex);
&o.uv&=&TRANSFORM_TEX(v.texcoord,_MainTex);
&o.normal&=&v.normal;
&#ifndef&USING_DIRECTIONAL_LIGHT
&float3&lightPos&=&mul(&inverse(UNITY_MATRIX_MV),unity_LightPosition[0]).xyz;
&o.lightDir&=&lightPos;
&o.lightDir&=&mul(&inverse(UNITY_MATRIX_MV),unity_LightPosition[0]).xyz;
&float3&viewpos&=&mul&(UNITY_MATRIX_MV,&v.vertex).xyz;
&float3&toLight&=&unity_LightPosition[0].xyz&-&viewpos.xyz&*&unity_LightPosition[0].w;
&float&lengthSq&=&dot(toLight,&toLight);
&o.atten&=&1.0&/&(1.0&+&lengthSq&*&unity_LightAtten[0].z);
&o.viewDir&=&mul&((float3x3)inverse(UNITY_MATRIX_MV),&float3(0,0,1)).xyz;
&return&o;
& &float4&frag&(v2f&i)&:&COLOR
&float4&texCol&=&tex2D(_MainTex,i.uv);
&i.normal&=&normalize(i.normal);
&i.lightDir&=&normalize(i.lightDir);
&i.viewDir&=&normalize(i.viewDir);
&//(<span STYLE="FonT-sTYLe: CoLor: #)漫反射强度
&float&diffuseF&=&max(0,dot(i.normal,i.lightDir));
&//***&漫反射光离散化&***
&&diffuseF&=&floor(diffuseF*&_DiffuseStep)/_DiffuseStep;
&&//(<span STYLE="FonT-sTYLe: CoLor: #)镜面反射强度
&float&specF;
&float3&H&=&normalize(i.lightDir&+&i.viewDir);
&float&specBase&=&max(0,dot(i.normal,H));
& &//&shininess&镜面强度系数
& &specF&=&pow(specBase,32);
& &//***&镜面反射光离散化&***
& &specF&=&floor(specF*&_SpecFacStep)/_SpecFacStep;
&&//(<span STYLE="FonT-sTYLe: CoLor: #)结合漫反射光与镜面反射光
&float4&outp&=&texCol*unity_LightColor[0]*(0.9&+&0.5*&diffuseF*i.atten&)+&unity_LightColor[0]*specF&*1;
&return&outp;
还有一种方法,与使用floor离散化不同。
将diffuse的强度映射至[0,1]
然后通过一张亮度表来纹理查询
diff=smoothstep(0,1,diff);
float&toon=tex2D(_ToonMap,float2(diff,diff)).r;
Shader&"Tut/Shader/Toon/Cel_2"&{
&Properties&{
&_ToonMap("Map&to&Toon",2D)="white"{}
&_Color("Main&Color",color)=(1,1,1,1)
&_Outline("Thick&of&Outline",range(0,0.1))=0.02
&_Factor("Factor",range(0,1))=0.5
&_ToonEffect("Toon&Effect",range(0,1))=0.5
&SubShader&{
&Tags{"LightMode"="Always"}
&Cull&Front
&ZWrite&On
&CGPROGRAM
&#pragma&vertex&vert
&#pragma&fragment&frag
&#include&"UnityCG.cginc"
&float&_Outline;
&float&_Factor;
&struct&v2f&{
& &float4&pos:SV_POSITION;
&v2f&vert&(appdata_full&v)&{
& &float3&dir=normalize(v.vertex.xyz);
& &float3&dir2=v.normal;
& &float&D=dot(dir,dir2);
& &dir=dir*sign(D);
& &dir=dir*_Factor+dir2*(1-_Factor);
& &v.vertex.xyz+=dir*_Outline;
& &o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
& &return&o;
&float4&frag(v2f&i):COLOR
& &float4&c=0;
& &return&c;
&}//end&of&pass
&Tags{"LightMode"="ForwardBase"}
&Cull&Back
&CGPROGRAM
&#pragma&vertex&vert
&#pragma&fragment&frag
&#include&"UnityCG.cginc"
&sampler2D&_ToonMap;
&float4&_LightColor0;
&float4&_Color;
&float&_ToonEffect;
&struct&v2f&{
& &float4&pos:SV_POSITION;
& &float3&lightDir:TEXCOORD0;
& &float3&viewDir:TEXCOORD1;
& &float3&normal:TEXCOORD2;
&v2f&vert&(appdata_full&v)&{
& &o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
& &o.normal=v.normal;
& &o.lightDir=ObjSpaceLightDir(v.vertex);
& &o.viewDir=ObjSpaceViewDir(v.vertex);
& &return&o;
&float4&frag(v2f&i):COLOR
& &float4&c=1;
& &float3&N=normalize(i.normal);
& &float3&viewDir=normalize(i.viewDir);
& &float3&lightDir=normalize(i.lightDir);
& &float&diff=max(0,dot(N,i.lightDir));
& &diff=(diff+1)/2;
& &diff=smoothstep(0,1,diff);
& &float&toon=tex2D(_ToonMap,float2(diff,diff)).r;
& &diff=lerp(diff,toon,_ToonEffect);
& &c=_Color*_LightColor0*(diff);
& &return&c;
&Tags{"LightMode"="ForwardAdd"}
&Blend&One&One
&Cull&Back
&ZWrite&Off
&CGPROGRAM
&#pragma&vertex&vert
&#pragma&fragment&frag
&#include&"UnityCG.cginc"
&float4&_LightColor0;
&sampler2D&_ToonMap;
&float4&_Color;
&float&_ToonEffect;
&struct&v2f&{
& &float4&pos:SV_POSITION;
& &float3&lightDir:TEXCOORD0;
& &float3&viewDir:TEXCOORD1;
& &float3&normal:TEXCOORD2;
&v2f&vert&(appdata_full&v)&{
& &o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
& &o.normal=v.normal;
& &o.viewDir=ObjSpaceViewDir(v.vertex);
& &o.lightDir=_WorldSpaceLightPos0-v.vertex;
& &return&o;
&float4&frag(v2f&i):COLOR
& &float4&c=1;
& &float3&N=normalize(i.normal);
& &float3&viewDir=normalize(i.viewDir);
& &float&dist=length(i.lightDir);
& &float3&lightDir=normalize(i.lightDir);
& &float&diff=max(0,dot(N,i.lightDir));
& &diff=(diff+1)/2;
& &diff=smoothstep(0,1,diff);
& &float&atten=1/(dist);
& &diff=diff*atten;
& &float&toon=tex2D(_ToonMap,float2(diff,diff)).r;
& &diff=lerp(diff,toon,_ToonEffect);
& &half3&h&=&normalize&(lightDir&+&viewDir);
& &float&nh&=&max&(0,&dot&(N,&h));
& &float&spec&=&pow&(nh,&32.0);
& &float&toonSpec=floor(spec*atten*2)/2;
& &spec=lerp(spec,toonSpec,_ToonEffect);
& &c=_Color*_LightColor0*(diff+spec);
& &return&c;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。鏌ョ湅: 15887|鍥炲?: 7
姹傚ぇ绁炴寚鐐癸細U3D鑷?彂鍏塻hader濡備綍鍐欙紵
褰撳墠绂荤嚎
涓婚?甯栧瓙璐$尞
鍒濈骇UU鏃忊

我要回帖

更多关于 unity3d 模型导出插件 的文章

 

随机推荐