Shader基于顶点编程的Lambert光照,Phong光照和Blinn-Phong光照
2015-12-18 09:36
405 查看
Lambert光照模型(环境光+漫反射):
Phong光照模型(环境光+漫反射+镜面高光):
Blinn-Phong光照模型(环境光+漫反射+半角镜面高光):
Shader "Custom/ShaderLambert" { SubShader { Pass{ CGPROGRAM #include "unitycg.cginc" #include "lighting.cginc" #pragma vertex vert #pragma fragment frag struct params{ float4 Pos:POSITION; float4 Col:COLOR; }; params vert(appdata_base ab) { params pms; pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex); pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光 float3 N; float3 L; //求法向量 //N = normalize(UnityObjectToWorldNormal(ab.normal)); //系统自带UnityObjectToWorldNormal:将模型法向量转换到世界 N = normalize(ab.normal); //自行处理法向量 N = mul(float4(N,0),_World2Object).xyz; //由于此处存在法向量非等比转换问题,故需要将法向量乘以它的逆转矩阵,如右侧 //求光向量 //L = normalize(WorldSpaceLightDir(ab.vertex)); //系统自带WorldSpaceLightDir:传入顶点求世界方向的光向量 L = normalize(_WorldSpaceLightPos0); //自行处理光向量,此处用mul,因为法向量和光向量变其中一个让他们统一就行 float DotNL = saturate(dot(N,L)); //计算漫反射夹角 pms.Col += _LightColor0 * DotNL; //环境光+漫反射 return pms; } float4 frag(params INPUT):COLOR { return INPUT.Col; } ENDCG } } }
Phong光照模型(环境光+漫反射+镜面高光):
Shader "Custom/ShaderPhong_Vertex" { Properties{ _SpecularColor("SpecularColor",color) = (1,1,1,1) } SubShader { Pass{ CGPROGRAM #include "unitycg.cginc" #include "lighting.cginc" #pragma vertex vert #pragma fragment frag float4 _SpecularColor; struct parmas{ float4 Pos:POSITION; float4 Col:COLOR; }; parmas vert(appdata_base ab) { parmas pms; pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex); pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光 float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz; float3 L =normalize(WorldSpaceLightDir(ab.vertex)).xyz; float DotNL = saturate(dot(N,L)); //转化为[0,1]之内 pms.Col = pms.Col+_LightColor0 * DotNL; //环境光 + 漫反射 //通过Reflect 获取反射光线 float3 R = normalize(reflect(-WorldSpaceLightDir(ab.vertex),N)); //使用reflect() 其中光源要指向顶点 //float3 R = normalize(2*dot(N,L)*N-L); //手动求反射R float3 V = normalize(WorldSpaceViewDir(ab.vertex)); float DotRV = max(0,dot(R,V)+0.1); //此处保留 pms.Col = pms.Col*0.8+_SpecularColor*DotRV*0.1; //环境光+漫反射+镜面反射高光 return pms; } float4 frag(parmas INPUT):COLOR { return INPUT.Col; } ENDCG } } }
Blinn-Phong光照模型(环境光+漫反射+半角镜面高光):
Shader "Custom/ShaderBlinnPhong_Vertex" { Properties{ _SpcularColor("SpecularColor",color) = (1,1,1,1) } SubShader { Pass{ CGPROGRAM #include "unitycg.cginc" #include "lighting.cginc" #pragma vertex vert #pragma fragment frag float4 _SpcularColor; struct parmas { float4 Pos:POSITION; float4 Col:COLOR; }; parmas vert(appdata_base ab) { parmas pms; pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex); pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光 float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz; float3 L = normalize(WorldSpaceLightDir(ab.vertex)).xyz; float DotNL = saturate(dot(N,L)); pms.Col = pms.Col + _LightColor0*DotNL; //环境光 + 漫反射 //求半角向量 float3 BJ = normalize(L + normalize(WorldSpaceViewDir(ab.vertex))); float DotLBJ = saturate(dot(BJ,N)); pms.Col = pms.Col*0.8 + pow(_SpcularColor*DotLBJ*0.6,4); //环境光 + 漫反射 + 镜面反射高光 return pms; } float4 frag(parmas INPUT):COLOR { return INPUT.Col; } ENDCG } } }
相关文章推荐
- java web emoji表情显示
- MATLAB 制作GIF图像
- Java工程师成神之路
- Java并行编程(parallel programming) 2
- Qt编译中工程文件Pro的语法
- iis 7 asp.net ajax post 请求字节过大报错问题解决办法
- Eclipse安装ADT插件速度慢的解决方法
- java虚拟机-运行时数据区域
- python学习记录(1)基础内容
- PHP IMG2TXT 图片转成文字
- 【代码笔记】传身份证号码可返回生日字符串
- 【代码笔记】传身份证号码可返回生日字符串
- [转]在SpringMVC中获取request对象的几种方式
- Python包安装——mayavi安装
- 第十一周项目1 - 二叉树算法验证.cpp
- Python 脚本分析(ftp上传文件、获取本地时间)
- Java的类锁和对象锁
- java thumbnail类库生成缩略图
- 集算器协助Java处理结构化文本之条件过滤
- 使用ant 的javac 运行时logback日志 pattern为 [null:-1] 的问题