【兰伯特光照与Blinn_Phong光照】
<1>兰伯特与半兰伯特
Shader "Tang/614/Lambert"{Properties{_Color("Tin Color",Color) = (1,1,1,1)}SubShader{Pass{Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert #pragma fragment frag #include "Lighting.cginc"fixed4 _Color;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL; };struct v2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);return o;}//兰伯特光照fixed4 frag(v2f i):SV_Target{fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 worldNormal = normalize(i.worldNormal);//兰伯特//fixed3 diffuse = _LightColor0.rgb*_Color.rgb* saturate(dot(lightDir,worldNormal));//半兰伯特fixed halfLambert = dot(lightDir,worldNormal)*0.5+0.5;fixed3 diffuse = _LightColor0.rgb*_Color.rgb* halfLambert;return fixed4(diffuse,1);}ENDCG}}}
<2>Blinn与Phong高光
Shader "Tang/614/Blinn"{Properties{_Color("漫反射",Color) = (1,1,1,1)_Specular("高光",Color) = (1,1,1,1)_Gloss("高光光滑度",Range(1,64)) = 2}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag #include "Lighting.cginc"fixed4 _Color;fixed4 _Specular;fixed _Gloss;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;float3 worldPos:TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;return o;}//blinn高光fixed4 frag(v2f i):SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//漫反射颜色//fixed halfLambert = dot(worldNormal,lightDir)*0.5+0.5;fixed lambert = saturate(dot(worldNormal,lightDir));fixed3 diffuse = _LightColor0.rgb*_Color.rgb*lambert;//高光 //blinn高光 不再求反射 而是引入一个新的向量 h = 视角+入射光 再用h与法线点乘//phong高光 用入射和法线求出反射n,再用n与视角点乘//上面2者的效果差不多,有些时候前者更是我们想要的效果,而且前者计算开销少些fixed3 viewDir = UnityWorldSpaceViewDir(i.worldPos);fixed3 h = normalize(lightDir+viewDir);fixed3 specular = _LightColor0.rgb*_Color.rgb* pow( saturate( dot(h,worldNormal) ),_Gloss);return fixed4(ambient+diffuse+specular,1); }ENDCG}}}
<3>采样反照率贴图的Blinn
Shader "Tang/614/BlinnTex"{Properties{_MainTex("反照贴图",2D) = "white" { }_Color("Tin Color",Color) = (1,1,1,1)_Specular("Specular",Color) = (1,1,1,1)_Gloss("Specular Gloss",Range(1,64)) = 8}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag #include "Lighting.cginc"struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 texcoord:TEXCOORD0;};struct v2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;float3 worldPos:TEXCOORD1;float2 uv:TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;fixed4 _Specular;fixed _Gloss;v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);return o;}fixed4 frag(v2f i):SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 viewDir = UnityWorldSpaceViewDir(i.worldPos);//反照率fixed3 albedo = tex2D(_MainTex,i.uv).rgb*_Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;fixed lambert = saturate(dot(worldNormal,lightDir));fixed3 diffuse = _LightColor0.rgb*albedo*lambert;fixed3 h = normalize(viewDir+lightDir);fixed sp = pow( saturate(dot(h,worldNormal)) ,_Gloss );fixed3 specular = _LightColor0.rgb*_Specular.rgb*sp;return fixed4(ambient+diffuse+specular,1);}ENDCG}}}
转载于:https://www.cnblogs.com/cocotang/p/11023350.html
【兰伯特光照与Blinn_Phong光照】相关推荐
- 【Unity Shader】(2)半兰伯特模型 构建光照
在unity的Shader中使用半兰伯特模型来构建光照 在认识半兰伯特模型之前,建议查看一下我之前的兰伯特模型构建光照 兰伯特光照模型 半兰伯特光照模型 由于兰伯特模型的计算公式仅截取了[0,1]的光 ...
- 兰伯特(Lambert)光照模型总结
兰伯特光照模型是经验模型,主要用来模拟粗糙物体表面的光照现象,即漫反射. 漫反射特点 1:反射强度与观察者的角度没有关系 2:反射强度与光线的入射角度有关系 漫反射光照符合兰伯特定律(Lambert' ...
- shader基础学习摘要(二) 兰伯特光照模型
在第6.4节中,书中给出了计算基本光照模型中漫反射光部分的计算公式分别表示为: 目录 漫反射模型 逐像素光照(逐顶点光照改进版) 逐顶点光照(兰伯特原版) 半兰伯特光照模型 漫反射模型 兰伯特定律:反 ...
- 漫反射:兰伯特和半兰伯特
兰伯特定律(Lambert is law); 反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比: 漫反射公式:C diffuse=(C light * M diffuse)max(0, < ...
- 6.2 漫反射-半兰伯特
//漫反射 半兰伯特 diffuse = (c.m)(0.5(n.i)+0.5) //模型背光面有可以有明暗变化 Shader "Unity shader book/Chapter 6/Ha ...
- 9.半兰伯特光照模型
前情提要:前面一节的漫反射实际上是根据兰伯特光照模型来进行实现的 但这种做法有个缺点就是顶点法线和光的夹角大于90度的时候的成色是完全黑的这和我们生活中见到的事物是不一样的.所以就有了新的光照模型-- ...
- U3D Shader半兰伯特模型
兰伯特光照模型--在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦值成正比.逐像素光照可以得到更加哦平滑的光照效果.但是,即便使用了逐像素漫反射光照,有一个问题仍然存在.在光照无法达到的区 ...
- Shader学习2——兰伯特
本以为写个兰伯特很简单,但是仔细考虑了一下,不光要受场景中光源影响,还需要受环境光影响,然后发现单个pass通道只能实现单光源.因此前期我们都只考虑单平行光. 兰伯特:漫反射颜色 = 光源颜色 x 材 ...
- Shader学习3——半兰伯特
半兰伯特其实就是把暗的地方提亮了一些,在数值上就是获取到的光源强度* 0.5 + 0.5,也就是原来是0的会变成0.5,原来是1的还是1. 半兰伯特:漫反射颜色 = 光源颜色 x 材质的漫反射颜色 x ...
最新文章
- 如何在matlab数组中添加新元素
- 时代聚焦AI安全——可解释性
- c语言按键中断程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
- 解决OpenCV3+VS2015(VS2017)运行时出现debug error abort()has been called的问题
- 循环爬取图片_Python爬虫爬取小姐姐照片!
- 1.2 控制器 view 的创建和加载
- html前端论文参考文献,web前端论文参考文献论文
- Maven by Example 1.7. Comparing Maven with Ant
- 函数连续,区间连续,一致连续,绝对连续,Lipschitz连续
- 为计算机技术奉献一生语录,乐于奉献的名言警句40句
- 面试——HR问你的职业规划,应该怎样回答?
- Python 安装 包时 VC 14 找不到错误终极解决办法
- iis7 下php 环境配置文件,Win7下在IIS7中配置PHP的环境
- Mockito 中被 Mocked 的对象属性及方法的默认值
- 使用群晖作mineportalbox(1):合理且不折腾地使用群晖硬件和套件
- 抖音同款 抖音 城堡 微信背景图,抖音城堡微信背景图
- 【AI系列文章推送一】什么是人工智能?
- 183条地铁线路,3034个地铁站,发现中国地铁名字的秘密。
- SAP_PP模块流程
- CMWAP和CMNET
热门文章
- android java 同步_Android 中的同步
- 如何自动升级php数据库,php – 如何在现实世界中“升级”数据库?
- pid算法matlab仿真程序和c程序,pid算法matlab仿真程序和c程序.doc
- pandas 导入excel_三行Python代码,合并多个Excel文件
- springmvc请求返回一个字符_response 返回 带双引号 的字符串解决办法 springmvc
- 使用Kotlin的Android Toast
- python gzip压缩_Python gzip –压缩解压缩
- kotlin_Kotlin阵列
- kotlin null_Kotlin Null安全– Kotlin可空
- nginx配置 负载均衡_如何配置NGINX负载平衡