Blinn-Phong光照模型不用计算反射方向,计算公式如下:

h = normalize(v + l);

Cspecular = Clight * mspecular * pow(max(0, dot(n, h), gloss))

转载请注明出处:http://www.cnblogs.com/jietian331/p/7097201.html

shader如下:

 Shader "Custom/Specular Blinn-Phong"
{
Properties
{
_Diffuse ("Diffuse Color", Color) = (,,,)
_Specular ("Specular Color", Color) = (,,,)
_Gloss ("Gloss", Range(, )) =
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
Tags { "LightMode"="ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "Lighting.cginc" struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
}; struct v2f
{
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
}; fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
// specular
float3 worldNormal = normalize(i.worldNormal);
float3 lightDir = UnityWorldSpaceLightDir(i.worldPos);
lightDir = normalize(lightDir);
float3 viewDir = UnityWorldSpaceViewDir(i.worldPos);
viewDir = normalize(viewDir);
float3 halfDir = normalize(lightDir + viewDir);
float d = max(, dot(halfDir, worldNormal));
float3 spec = _LightColor0.rgb * _Specular.rgb * pow(d, _Gloss); // diffuse
float3 diff = _LightColor0.rgb * _Diffuse.rgb * max(, dot(lightDir, worldNormal)); float3 c = spec + diff + UNITY_LIGHTMODEL_AMBIENT.rgb;
return fixed4(c, );
}
ENDCG
}
}
}

效果如下:

这种光照模型的高光反射看起来更大,更亮一些。在实际渲染中,绝大多数情况会选择 Blinn-Phong 光照模型,此种光照模型更符合实验结果。

最新文章

  1. final修饰符
  2. 一个C++宏定义与枚举定义重复的编译错误
  3. leetcode - 位运算题目汇总(下)
  4. springMVC 缓存(入门 spring+mybaties+redis一)
  5. 从0到1---“保多多”APP的开发(二)
  6. 菜鸟学Linux命令:tail命令 查看日志
  7. Web 安全的短板
  8. Redis 管道技术
  9. Sublime Text 使用简介
  10. poj 2051 Argus(优先队列)
  11. 变量类型-Tuple
  12. 论文笔记:Progressive Neural Architecture Search
  13. HBuilder使用夜神模拟器调试Android应用
  14. 二、两条Linux删除数据跑路命令
  15. 004.Heartbeat+HAProxy+MySQL半复制高可用架构
  16. java内部类及四种内部类的实现方式
  17. python2&python3
  18. 戴尔dell服务器硬件故障SMTP邮件报警idrac配置
  19. Linux Ubuntu下用Android NDK 生成独立交叉编译链
  20. [Golang] GOROOT、GOPATH和Project目录说明

热门文章

  1. java登录怎么做
  2. [qemu][kvm] 在一个vmware虚拟机里安装qemu-kvm虚拟机
  3. [cloud][OVS][sdn] Open vSwitch 初步了解
  4. OpenGL教程和书籍
  5. 转:SAX解析的characters方法被多次调用
  6. 几种Linux 查询外网出口IP的方法(转)
  7. 终于解决“Git Windows客户端保存用户名与密码”的问题(转载)
  8. 域PC脱域
  9. 对CountDownLatch的初步学习
  10. windows下安装Git安装