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 ...
随机推荐
- ArcGIS JS API4 With VueJS集成开发
1.USING VUEJS WITH ARCGIS API FOR JAVASCRIPT,集成VUE到ArcGIS JS开发中. 2.ARCGIS API 4 FOR JS WITH VUE-CLI ...
- webpack学习笔记 (一)
一.安装nodejs: 点击打开nodejs官方站点: 点击下图框住的按钮,下周nodejs安装包: 安装下载好的安装包. 安装完毕之后,在cmd中输入node -v查看是否已经安装成功 如果有版本 ...
- 小程序md5加密
function md5(string) { var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; , S12 = , S13 = , S14 = ; ...
- python3读写csv文件
python读取CSV文件 python中有一个读写csv文件的包,直接import csv即可.利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下. 1. 读文件 csv_ ...
- 使用js如何设置、获取盒模型的宽和高
第一种: dom.style.width/height 这种方法只能获取使用内联样式的元素的宽和高. 第二种: dom.currentStyle.width/height 这种方法获取的是浏览器渲染以 ...
- docker中lnmp环境部署laravel框架
yum install docker 安装docker service docker start 启动docker docker pull docker.io/skiychan/ngin ...
- 调试 kafka manager 源码
前提:可以上外网. kafka manager 是一款优秀的监控 kafka 的工具,采用 scala 语言编写,如何调试 kafka manager 呢? kafka manager 使用 play ...
- CentOS7系统上的GPSTK源码安装
网址:http://www.gpstk.org/bin/view/Documentation/BuildingGPSTkUnderUnix 这里使用Cmake来安装源码,网站上的原文摘抄如下,有少部分 ...
- Excel中如何截取字符串中指定字符后的部分字符
1.如何给某列属性为时间整体加一个时间值: 场景一:假如我有一个excel中的某一列如下图所示,如何将该列的时间(用B代替整列)整体加一分钟呢?方法很简单,在空白单元格填写时间格式图中A所示 ...
- 银行卡卡bin
卡BIN指的是发卡行识别码,英文全称是 Bank Identification Number,缩写为 BIN.中文即“银行识别代码” 银行卡的卡号是标识发卡机构和持卡人信息的号码 一般是13-19位 ...