公司网站后台更新,什么是精准营销,汉寿网站建设,怎样加入网络营销公司Lambert漫反射光照模型#xff0c;这是一个用来模拟粗糙表面对光线的漫反射现象的经验模型#xff0c;对于纸张、粗糙墙壁等等来说#xff0c;这个模型或许够用#xff0c;但对于金属这样的光滑表面来说#xff0c;我们就需要使用Phong模型来模拟光滑表面对光线的镜面反射…Lambert漫反射光照模型这是一个用来模拟粗糙表面对光线的漫反射现象的经验模型对于纸张、粗糙墙壁等等来说这个模型或许够用但对于金属这样的光滑表面来说我们就需要使用Phong模型来模拟光滑表面对光线的镜面反射现象。同Lambert一样这个模型也是经验模型而且在程序中我们经常同时使用Lambert和Phong两个模型因为在现实世界中任何表面都会同时发生漫反射和镜面反射两种现象因此我们就要使用两种模型分别计算两种反射后的光强也就是顶点颜色值是渲染的效果看起来真实一些。但要注意这样做并不会带来真正真实的渲染效果毕竟这两种模型都是经验模型考虑的都是理想情况下。而Blinn-phong光照模型是基于Phong的修正模型。 设顶点的单位法向量为N有公式 R L (2N • L)N 这里再次提醒一下L的方向是由顶点指向光源的 由这个可以推出 R (2N • L)N - L 因此Phong的公式如下图左图所示。 Shader Study/7_Phong {Properties{_Color(Main Color, Color) (1,1,1,1)_SpecColor(Specular Color, Color) (0.5, 0.5, 0.5, 1)// 高光颜色_Shininess(Shininess, Range(0.01, 1)) 0.078125// 高光指数【光泽度】_MainTex(Base (RGB) Gloss (A), 2D) white {}}SubShader{Tags{ RenderType Opaque }LOD 300CGPROGRAM
#pragma surface surf BlinnPhongTest// 半角向量和BilnnPhong:使用入射光线和视线的中间平均值即半角向量然后使用该半角和法线计算出一个和视角相关的高光。// 相关参数【lightDir点到光源单位向量】【viewDir点到摄像机单位向量】【atten衰减系数】【_LightColor0场景中平行光的颜色】float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten){// 1.半角向量求点到光源点到摄像机的单位向量他们的中间平均值float3 h normalize(lightDir viewDir);// 2.漫反射系数【点到光源单位向量与法线向量的余弦值】float diff max(0, dot(s.Normal, lightDir));// 3.反射向量float3 r 2 * dot(s.Normal, lightDir) * s.Normal - lightDir;// 4.高光底数【反射向量与视角向量的余弦值】float re max(0, dot(r, viewDir));// 5.高光系数根据高光低数和高光指数求得float spec pow(re, s.Specular * 256) * s.Gloss;float4 c;// 6.最终光照rgb 漫反射半角高光c.rgb (s.Albedo * _LightColor0.rgb * diff _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);c.a s.Alpha _LightColor0.a * _SpecColor.a * spec * atten;return c;}sampler2D _MainTex; // 主材质fixed4 _Color; // 主材质颜色half _Shininess; // 高光指数struct Input {float2 uv_MainTex; // 主材质的UV信息};void surf(Input IN, inout SurfaceOutput o) {// 取主纹理的对应当前像素点的值fixed4 tex tex2D(_MainTex, IN.uv_MainTex);// Albedo反照率即物体反射光的数量与外来光数量的比值。// Albedo 主纹理 x 主色调反映了物体的基色与任何光相关的信息比如diffuse, shiness等无关o.Albedo tex.rgb * _Color.rgb; // 颜色纹理主纹理*主材质颜色// Gloss光滑度[0, 1]用于控制反射的模糊程度值越大高光反射越清晰反之则越模糊0将无高光效果。// 光滑度的“滑”是面的概念代表物体整体的光滑程度// 比如说同样一块金属在它生锈的过程中其反射就会慢慢变弱可以通过Gloss值控制// 实际上它是针对高光计算结果的附加系数o.Gloss tex.a;o.Alpha tex.a * _Color.a; // 透明度// Shininess光泽度[0, 1]又叫高光指数或镜面反射指数注意它在SurfaceOutput结构中的命名Specular很容易让人误解为它是高光强度其实不然它是高光指数// 光泽度的“泽”是点的概念代表物体某个高光点的光泽程度o.Specular _Shininess; // 越小光泽度越高0为全白//o.Emission tex.rgb;}ENDCG}Fallback VertexLit
}相比较Phong模型Blinn-phong模型只适用N•H替换了V•R但却获得了明显的提高它能提供比Phong更柔和、更平滑的高光而且速度上也更快因此成为很多CG软件中默认的光照渲染方法同时也被集成到大多数的图形芯片中而且在OpenGL和DirectX 3D的渲染管线中它也是默认的光照模型。 由于这两个光照模型公式基本相同所以只解释一下N•H N与前面相同是顶点的单位法向量而H则是入射光L和顶点到视点的单位向量的角平分线单位向量通常也成为半角向量。其计算方法为 H (L V) / (|L V|)
Shader Study/7_BlinnPhong {Properties{_Color(Main Color, Color) (1,1,1,1)_SpecColor(Specular Color, Color) (0.5, 0.5, 0.5, 1)// 高光颜色_Shininess(Shininess, Range(0.01, 1)) 0.078125// 高光指数【光泽度】_MainTex(Base (RGB) Gloss (A), 2D) white {}}SubShader{Tags{ RenderType Opaque }LOD 300CGPROGRAM
#pragma surface surf BlinnPhongTest// 半角向量和BilnnPhong:使用入射光线和视线的中间平均值即半角向量然后使用该半角和法线计算出一个和视角相关的高光。// 相关参数【lightDir点到光源单位向量】【viewDir点到摄像机单位向量】【atten衰减系数】【_LightColor0场景中平行光的颜色】float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten){// 1.半角向量求点到光源点到摄像机的单位向量他们的中间平均值float3 h normalize(lightDir viewDir);// 2.漫反射系数【点到光源单位向量与法线向量的余弦值】float diff max(0, dot(s.Normal, lightDir));// 3.高光底数【半角向量与法线向量的余弦值】float nh max(0, dot(s.Normal, h));// 4.高光系数根据高光低数和高光指数求得float spec pow(nh, s.Specular * 256) * s.Gloss;float4 c;// 5.最终光照rgb 漫反射半角高光c.rgb (s.Albedo * _LightColor0.rgb * diff _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);c.a s.Alpha _LightColor0.a * _SpecColor.a * spec * atten;return c;}sampler2D _MainTex; // 主材质fixed4 _Color; // 主材质颜色half _Shininess; // 高光指数struct Input {float2 uv_MainTex; // 主材质的UV信息};void surf(Input IN, inout SurfaceOutput o) {// 取主纹理的对应当前像素点的值fixed4 tex tex2D(_MainTex, IN.uv_MainTex);// Albedo反照率即物体反射光的数量与外来光数量的比值。// Albedo 主纹理 x 主色调反映了物体的基色与任何光相关的信息比如diffuse, shiness等无关o.Albedo tex.rgb * _Color.rgb; // 颜色纹理主纹理*主材质颜色// Gloss光滑度[0, 1]用于控制反射的模糊程度值越大高光反射越清晰反之则越模糊0将无高光效果。// 光滑度的“滑”是面的概念代表物体整体的光滑程度// 比如说同样一块金属在它生锈的过程中其反射就会慢慢变弱可以通过Gloss值控制// 实际上它是针对高光计算结果的附加系数o.Gloss tex.a;o.Alpha tex.a * _Color.a; // 透明度// Shininess光泽度[0, 1]又叫高光指数或镜面反射指数注意它在SurfaceOutput结构中的命名Specular很容易让人误解为它是高光强度其实不然它是高光指数// 光泽度的“泽”是点的概念代表物体某个高光点的光泽程度o.Specular _Shininess; // 越小光泽度越高0为全白//o.Emission tex.rgb;}ENDCG}Fallback VertexLit
}