首页 > 编程知识 正文

光的衍射菲涅尔,光的菲涅尔效应

时间:2023-05-06 02:08:01 阅读:236163 作者:943

Shader"review/EdgeEmission"{///标准光照模型 光照数据=自发光(E)+漫反射光(D)+环境光(A)+高光(S) Properties { _MainTexture("主贴图",2D)="white"{} _NormalMap("法线贴图",2D)="white"{} _SpecularColor("高光颜色",color)=(1,1,1,1) _Gloss("高光范围",Range(8,256))=20 _FrenelColor("边缘光颜色",color)=(1,1,1,1) _EdgeWidth("边缘光范围",range(0,10))=2 _EdgeValue("边缘光边界值",range(0,10))=2 _Att("边缘光强度",float)=1 } SubShader { Pass { Tags{"LightMode"="ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _SpecularColor; float _Gloss; sampler2D _MainTexture; fixed4 _MainTexture_ST;//xyzw Tilling offset sampler2D _NormalMap; float3 _FrenelColor; float _EdgeWidth; float _EdgeValue; float _Att; struct a2v { fixed3 verts:POSITION; fixed3 normal:NORMAL; fixed4 uv:TEXCOORD0; }; struct v2f { fixed4 verts:SV_POSITION; fixed2 uv:TEXCOORD1; fixed3 worldPos:TEXCOORD2; fixed3 vertexNoraml:TEXCOORD0; }; v2f vert(a2v v) { v2f o; o.verts=UnityObjectToClipPos(v.verts); o.worldPos=mul(unity_ObjectToWorld,v.verts).xyz; o.uv=TRANSFORM_TEX(v.uv,_MainTexture); o.vertexNoraml=UnityObjectToWorldNormal(v.normal); return o; } fixed4 frag (v2f i):SV_Target { fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光 fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz) ;//世界光 fixed3 viewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));//视角方向 注意方向 fixed3 worldNormalFromMap=normalize(tex2D(_NormalMap,i.uv)); fixed3 reflDir=normalize(reflect(worldLightDir,worldNormalFromMap));//反射方向 fixed ndotv=dot(normalize(i.vertexNoraml),viewDir);//法线与视线方向夹角大小 fixed3 value=tex2D(_MainTexture,i.uv).rgb; fixed3 albedo=ambient*value;//环境光*贴图*漫反射光 A fixed3 diffuse=_LightColor0.rgb*value;//直线光*贴图*漫反射光 D fixed3 specular=_LightColor0.rgb*pow(saturate(dot(viewDir,reflDir)),_Gloss);//高光颜色 S fixed3 color=albedo+diffuse+specular; float rat=abs(pow(1-ndotv,_EdgeWidth));// 颜色根据ndotv渐变 if (rat<=_EdgeValue)//根据值使得边缘整齐一点,=0时有渐变 { rat=0; } //rat=0时 输出值为 第一个参数值 fixed3 frenel=lerp(fixed3(0,0,0),_FrenelColor*_Att,rat);//只计算菲涅尔颜色,所以计算黑色到边缘光颜色的渐变 return fixed4(frenel+color,1); //A+D+S } ENDCG } }}


左边的人物就是使用菲涅尔做出的边缘发光效果。
右边的圆柱不仅可以看到菲涅尔的边缘光,还可以看到高光,是看到网上说做kxdmy效果就来试一下。好像也可以。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。