Blinn-Phong模型
最近在看基础光照模型,比较感兴趣的是高光反射模型,有下列两种:
1.Phong模型
R = 2*N(dot(N, L)) - L
specular = lightColor * SpecularColor*(max(V· R, 0)) ^shininess;
2.Blinn-Phong模型
引入了H,Blinn模型不仅在速度上更快,而且更符合实际。
H = normalize(L+V)
specular = lightColor * SpecularColor*(max(N· H, 0)) ^shininess;
下面上Shader代码
Shader "基础光照/BlinnPhongShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_SpecularColor("SpecColor",Color) = (,,,)
_DiffuseColor("DiffuseColor",Color) = (,,,)
_Gloss("Gloss",Range(,)) =
}
SubShader
{
Tags{"RenderType"="Opaque"}
//Cull Off ZWrite Off ZTest Always Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "UnityCG.cginc" struct appdata
{
float4 pos : POSITION;
float3 normal : NORMAL;
float2 uv: TEXCOORD0; }; struct v2f
{ float4 pos: SV_POSITION; float2 uv :TEXCOORD0; float3 normal : TEXCOORD1; float4 worldPos : TEXCOORD2;
}; v2f vert (appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.pos);
o.worldPos= mul(_Object2World,v.pos);
o.normal = normalize( mul(v.normal,(float3x3)_World2Object));
o.uv = v.uv;
return o;
} sampler2D _MainTex;
fixed4 _DiffuseColor;
fixed4 _SpecularColor;
float _Gloss; fixed4 frag(v2f i): SV_Target
{
//计算环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; float3 worldNormal = i.normal; float3 worldLightDir = -normalize(_WorldSpaceLightPos0.xyz); //计算漫反射
fixed3 diffuse = _LightColor0.rgb*_DiffuseColor*saturate(dot(worldNormal,worldLightDir)); //计算高光反射 float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz); fixed3 h = normalize(worldLightDir+viewDir); fixed3 specular = _LightColor0.rgb*_SpecularColor*(pow(saturate(dot(h,worldNormal)),_Gloss));
fixed4 col = tex2D(_MainTex,i.uv);
return col*fixed4(ambient+diffuse+specular,1.0);
} ENDCG
}
}
FallBack "Specular"
}
效果展示
Blinn-Phong模型的更多相关文章
- Lambert漫反射.BLinnPhong及Phong模型 Unity自带的在Lighting.cginc里
1.漫反射 此模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象 此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体),同时,场景中存在两种光,一种为环境光,一 ...
- 用DirectX12实现Blinn Phong
这次我们来用DirectX12实现一下基本的Blinn Phong光照模型.让我们再把这个光照模型的概念过一遍:一个物体的颜色由三个因素决定:ambient, diffuse, specular.am ...
- 合金装备V 幻痛 制作技术特辑
合金装备V:幻痛 制作特辑 资料原文出自日版CGWORLD2015年10月号 在[合金装备4(Metal Gear Solid IV)]7年后,序章作品[合金装备5 :原爆点 (Metal Gea ...
- 【Unity Shader】(六) ------ 复杂的光照(上)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...
- 三种光照模型的shader实现
1.Lambert模型,公式为I=Kd*Il(N*L): Shader "Custom/Lambert_A" { Properties { _Diffuse(,,,) } SubS ...
- PBR Step by Step( 五)Phong反射模型
Lamertian模型描述了当光源直接照射到粗糙物体表面时,反射光线的分布情况.在现实中,除了直接光照,还有来自周围环境的间接光照. 直接照射到物体表面的光照,又称为局部光照: 间接照射到物体表面的光 ...
- [计算机图形学]绘制填充模型:重心坐标、z-buffer
目录 一.点乘和叉乘 0. 向量表示 1. 点乘 2.叉乘 2.1 坐标运算方式 2.2 向量运算方式 2.3 叉乘的用途 二.Bounding Box 三.重心坐标 四.z-buffer 五.总结 ...
- Phong和Blinn-Phong光照模型
Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.Phong模型 Phone模型计算中的一个关键步骤就是反射向量R的计算: 上图中的位于表面“下面”的向 ...
- 【转】Phong和Blinn-Phong光照模型
来自:http://www.cnblogs.com/bluebean/p/5299358.html Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.P ...
随机推荐
- 前后端分离之【接口文档管理及数据模拟工具docdoc与dochelper】
前后端分离的常见开发方式是: 后端:接收http请求->根据请求url及params处理对应业务逻辑->将处理结果序列化为json返回 前端:发起http请求并传递相关参数->获取返 ...
- 接口测试工具postman
一. 安装 1. 免费官网链接:https://www.getpostman.com/postman,下载好后双击.exe程序安装即可 2. 注意事项:建议安装在非系统盘,即C盘以外的盘,路径最好用全 ...
- PyQt5——隐藏控件并保留位置
原文地址:https://blog.csdn.net/qq_38161040/article/details/86605798 ———————————————————————————————— 设置控 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- sqlalchemy基础教程
一.基本配置 连接数据库 外部连接数据库时,用于表名数据库身份的一般是一个URL.在sqlalchemy中将该URL包装到一个引擎中,利用这个引擎可以扩展出很多ORM中的对象. from sqlalc ...
- OO第二单元多线程电梯总结分析
一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...
- PAT 1144 The Missing Number
1144 The Missing Number (20 分) Given N integers, you are supposed to find the smallest positive in ...
- java中之内存溢出说明
java语句是编译型和解释型语言,选通过编译命令javac 把java文件编译为.class字节码文件,然后通过java虚拟机(JVM)加载class文件到内存运行. 而java虚拟机在运行程序时有自 ...
- mysql排序之ORDER BY IF、ORDER BY配合IN、TIMESTAMPDIFF、TIMESTAMPADD、FIELD
1.order by if 排序 SELECT * FROM pet ORDER BY if (species='snake',0,1),species;--species为snake的行数放置到了查 ...
- textarea右下角黑点
先记录问题及解决方法,原因后续深入了解 在布局中,用到了textarea 输入框,在Android手机上却显示右下角有一个黑点,检查代码无误,代码没有多余的点符号. 解决:在textarea 中添加 ...