最近在看基础光照模型,比较感兴趣的是高光反射模型,有下列两种:

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模型的更多相关文章

  1. Lambert漫反射.BLinnPhong及Phong模型 Unity自带的在Lighting.cginc里

    1.漫反射 此模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象 此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体),同时,场景中存在两种光,一种为环境光,一 ...

  2. 用DirectX12实现Blinn Phong

    这次我们来用DirectX12实现一下基本的Blinn Phong光照模型.让我们再把这个光照模型的概念过一遍:一个物体的颜色由三个因素决定:ambient, diffuse, specular.am ...

  3. 合金装备V 幻痛 制作技术特辑

    合金装备V:幻痛 制作特辑 资料原文出自日版CGWORLD2015年10月号   在[合金装备4(Metal Gear Solid IV)]7年后,序章作品[合金装备5 :原爆点 (Metal Gea ...

  4. 【Unity Shader】(六) ------ 复杂的光照(上)

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.              [Unity Sha ...

  5. 三种光照模型的shader实现

    1.Lambert模型,公式为I=Kd*Il(N*L): Shader "Custom/Lambert_A" { Properties { _Diffuse(,,,) } SubS ...

  6. PBR Step by Step( 五)Phong反射模型

    Lamertian模型描述了当光源直接照射到粗糙物体表面时,反射光线的分布情况.在现实中,除了直接光照,还有来自周围环境的间接光照. 直接照射到物体表面的光照,又称为局部光照: 间接照射到物体表面的光 ...

  7. [计算机图形学]绘制填充模型:重心坐标、z-buffer

    目录 一.点乘和叉乘 0. 向量表示 1. 点乘 2.叉乘 2.1 坐标运算方式 2.2 向量运算方式 2.3 叉乘的用途 二.Bounding Box 三.重心坐标 四.z-buffer 五.总结 ...

  8. Phong和Blinn-Phong光照模型

    Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.Phong模型 Phone模型计算中的一个关键步骤就是反射向量R的计算: 上图中的位于表面“下面”的向 ...

  9. 【转】Phong和Blinn-Phong光照模型

    来自:http://www.cnblogs.com/bluebean/p/5299358.html Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.P ...

随机推荐

  1. 迁移学习 transferlearning

    2019-04-08 13:25:17 在实践中,很少有人从头开始训练整个卷积网络(随机初始化),因为拥有足够大小的数据集是相对罕见的.相反,通常在非常大的数据集(例如ImageNet,其包含具有10 ...

  2. Java程序设计的第二次作业

    本次作业包含两个部分:一是以下4个题目的程序源码和运行结果截图:二是本次作业的小结(谈谈你在做作业的过程中遇到了哪些问题,如何解决,有哪些收获). 1.编写“人”类及其测试类.1.1 “人”类: 类 ...

  3. 修改 jenkins 主目录

    说明 Jenkins有时需要进行迁移,主目录会发生改变,本文主要讲解如何更改主目录.由于jenkins安装方式的不同,主目录也不一样.本测试环境:Centos6.8 X64.注意:在更改主目录之前,请 ...

  4. 数学运算比IF要快

    问题 虽然很早就知道,CPU在处理 if 这样的判断语句时,使用了预测的技术,所以如果条件总是一个结果,效率就很好.反过来说,如果你使用数学运算避免 if 判断,那么就意味着性能一定比 if 要好. ...

  5. IPFS扫盲

    第二届深圳区块链技术与应用大会暨展览会,深圳区块链存储与IPFS技术应用大会暨展览会于2019年4月9日在深圳会展中心6号馆举行.那么这个IPFS是什么?和区块链有什么关系?有什么用?又怎么用呢?接下 ...

  6. 第一课——git的简介和基本使用

    windows中安装git: 1.安装Git 安装完,在命令行输入: $ git config --global user.name "Your Name" $ git confi ...

  7. vue 的全局组件和 局部组件

    vue组件局部与全局注册的区别   //局部注册 var mycomponent = new extend({        <!--Vue.extend()是Vue构造器的扩展,调用Vue.e ...

  8. 原生js手动轮播图

    手动轮播图,为轮播图中的一种,轮播图主要有无缝轮播,手动轮播,延迟轮播,切换轮播等等... 轮播图主要用于展现图片,新出商品,词条,又能美观网页.給网页中增加动态效果. 手动轮播,是小编认为最简单的一 ...

  9. Problem - 1062 http://acm.hdu.edu.cn/showproblem.php?pid=1062

    对输入字符串的字符的倒置,在这个程序中,我觉得自己最大的问题是怎么识别一个字符,代码中有t个字符串,每个字符串,每个字符串中有若干个单词,单词之间有空格,所以对于下列的正确答案,我的疑惑是当我键盘输入 ...

  10. go ethereum源码分析 PartIV Transaction相关

    核心数据结构: core.types.transaction.go type Transaction struct { data txdata // caches hash atomic.Value ...