7.Phong 和 BlinnPhong

Lambert漫反射光照模型,这是一个用来模拟粗糙表面对光线的漫反射现象的经验模型,对于纸张、粗糙墙壁等等来说,这个模型或许够用,但对于金属这样的光滑表面来说,我们就需要使用Phong模型来模拟光滑表面对光线的镜面反射现象。同Lambert一样,这个模型也是经验模型,而且在程序中,我们经常同时使用Lambert和Phong两个模型,因为在现实世界中,任何表面都会同时发生漫反射和镜面反射两种现象,因此我们就要使用两种模型分别计算两种反射后的光强(也就是顶点颜色值),是渲染的效果看起来真实一些。但要注意,这样做并不会带来真正真实的渲染效果,毕竟这两种模型都是经验模型,考虑的都是理想情况下。而Blinn-phong光照模型是基于Phong的修正模型。

设顶点的单位法向量为N,有公式:

R + L = (2N • L)N   (这里再次提醒一下,L的方向是由顶点指向光源的)

由这个可以推出:

R = (2N • L)N - L

因此Phong的公式如下图左图所示。


imageimage

Shader "Study/7_Phong" {Properties{_Color("Main Color", Color) = (1,1,1,1)_SpecColor("Specular Color", Color) = (0.5, 0.5, 0.5, 1)// 高光颜色_Shininess("Shininess", Range(0.01, 1)) = 0.078125// 高光指数【光泽度】_MainTex("Base (RGB) Gloss (A)", 2D) = "white" {}}SubShader{Tags{ "RenderType" = "Opaque" }LOD 300CGPROGRAM
#pragma surface surf BlinnPhongTest// 半角向量和BilnnPhong:使用入射光线和视线的中间平均值,即半角向量,然后使用该半角和法线计算出一个和视角相关的高光。// 相关参数:【lightDir点到光源单位向量】【viewDir点到摄像机单位向量】【atten衰减系数】【_LightColor0场景中平行光的颜色】float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten){// 1.半角向量:求(点到光源+点到摄像机)的单位向量,他们的中间平均值float3 h = normalize(lightDir + viewDir);// 2.漫反射系数【点到光源单位向量与法线向量的余弦值】float diff = max(0, dot(s.Normal, lightDir));// 3.反射向量float3 r = 2 * dot(s.Normal, lightDir) * s.Normal - lightDir;// 4.高光底数【反射向量与视角向量的余弦值】float re = max(0, dot(r, viewDir));// 5.高光系数:根据高光低数和高光指数求得float spec = pow(re, s.Specular * 256) * s.Gloss;float4 c;// 6.最终光照rgb = 漫反射+半角高光c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;return c;}sampler2D _MainTex; // 主材质fixed4 _Color;  // 主材质颜色half _Shininess; // 高光指数struct Input {float2 uv_MainTex; // 主材质的UV信息};void surf(Input IN, inout SurfaceOutput o) {// 取主纹理的对应当前像素点的值fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);// Albedo反照率,即物体反射光的数量与外来光数量的比值。// Albedo = 主纹理 x 主色调,反映了物体的基色,与任何光相关的信息(比如diffuse, shiness等)无关o.Albedo = tex.rgb * _Color.rgb;    // 颜色纹理=主纹理*主材质颜色// Gloss光滑度[0, 1],用于控制反射的模糊程度,值越大,高光反射越清晰,反之则越模糊,0将无高光效果。// 光滑度的“滑”是面的概念,代表物体整体的光滑程度// 比如说,同样一块金属,在它生锈的过程中,其反射就会慢慢变弱,可以通过Gloss值控制// 实际上它是针对高光计算结果的附加系数o.Gloss = tex.a;o.Alpha = tex.a * _Color.a;      // 透明度// Shininess光泽度[0, 1],又叫高光指数或镜面反射指数,注意,它在SurfaceOutput结构中的命名(Specular)很容易让人误解为它是高光强度,其实不然,它是高光指数// 光泽度的“泽”是点的概念,代表物体某个高光点的光泽程度o.Specular = _Shininess; // 越小光泽度越高,0为全白//o.Emission = tex.rgb;}ENDCG}Fallback "VertexLit"
}


相比较Phong模型,Blinn-phong模型只适用N•H替换了V•R,但却获得了明显的提高,它能提供比Phong更柔和、更平滑的高光,而且速度上也更快,因此成为很多CG软件中默认的光照渲染方法,同时也被集成到大多数的图形芯片中,而且在OpenGL和DirectX 3D的渲染管线中,它也是默认的光照模型。

 

由于这两个光照模型公式基本相同,所以只解释一下N•H:

N与前面相同,是顶点的单位法向量,而H则是入射光L和顶点到视点的单位向量的角平分线单位向量,通常也成为半角向量。其计算方法为:

H = (L + V) / (|L + V|)

Shader "Study/7_BlinnPhong" {Properties{_Color("Main Color", Color) = (1,1,1,1)_SpecColor("Specular Color", Color) = (0.5, 0.5, 0.5, 1)// 高光颜色_Shininess("Shininess", Range(0.01, 1)) = 0.078125// 高光指数【光泽度】_MainTex("Base (RGB) Gloss (A)", 2D) = "white" {}}SubShader{Tags{ "RenderType" = "Opaque" }LOD 300CGPROGRAM
#pragma surface surf BlinnPhongTest// 半角向量和BilnnPhong:使用入射光线和视线的中间平均值,即半角向量,然后使用该半角和法线计算出一个和视角相关的高光。// 相关参数:【lightDir点到光源单位向量】【viewDir点到摄像机单位向量】【atten衰减系数】【_LightColor0场景中平行光的颜色】float4 LightingBlinnPhongTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten){// 1.半角向量:求(点到光源+点到摄像机)的单位向量,他们的中间平均值float3 h = normalize(lightDir + viewDir);// 2.漫反射系数【点到光源单位向量与法线向量的余弦值】float diff = max(0, dot(s.Normal, lightDir));// 3.高光底数【半角向量与法线向量的余弦值】float nh = max(0, dot(s.Normal, h));// 4.高光系数:根据高光低数和高光指数求得float spec = pow(nh, s.Specular * 256) * s.Gloss;float4 c;// 5.最终光照rgb = 漫反射+半角高光c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;return c;}sampler2D _MainTex; // 主材质fixed4 _Color;  // 主材质颜色half _Shininess; // 高光指数struct Input {float2 uv_MainTex; // 主材质的UV信息};void surf(Input IN, inout SurfaceOutput o) {// 取主纹理的对应当前像素点的值fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);// Albedo反照率,即物体反射光的数量与外来光数量的比值。// Albedo = 主纹理 x 主色调,反映了物体的基色,与任何光相关的信息(比如diffuse, shiness等)无关o.Albedo = tex.rgb * _Color.rgb;    // 颜色纹理=主纹理*主材质颜色// Gloss光滑度[0, 1],用于控制反射的模糊程度,值越大,高光反射越清晰,反之则越模糊,0将无高光效果。// 光滑度的“滑”是面的概念,代表物体整体的光滑程度// 比如说,同样一块金属,在它生锈的过程中,其反射就会慢慢变弱,可以通过Gloss值控制// 实际上它是针对高光计算结果的附加系数o.Gloss = tex.a;o.Alpha = tex.a * _Color.a;      // 透明度// Shininess光泽度[0, 1],又叫高光指数或镜面反射指数,注意,它在SurfaceOutput结构中的命名(Specular)很容易让人误解为它是高光强度,其实不然,它是高光指数// 光泽度的“泽”是点的概念,代表物体某个高光点的光泽程度o.Specular = _Shininess; // 越小光泽度越高,0为全白//o.Emission = tex.rgb;}ENDCG}Fallback "VertexLit"
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html css animation,css animation是什么?

animation是CSS3中的一个简写属性,可以通过设置六个动画属性来实现动画效果。这六个属性分别为动画名称、动画时间、速度曲线、动画延迟、播放次数及动画是否反向播放。语法:animation: name duration timing-function delay iteration-count direction;…

8.平面阴影

public class CastShadow : MonoBehaviour {public Transform rec;//接受阴影的物体// Use this for initializationvoid Start () {GetComponent<Renderer>().sharedMaterial.SetMatrix("_World2Ground", rec.GetComponent<Renderer>().worldToLocalMat…

9.球体阴影

上一篇讲的阴影shader是通过两个pass来渲染出的&#xff0c;第一个pass渲染要投影的物体本体&#xff0c;第二个pass渲染物体的阴影&#xff0c;也就是说阴影的渲染是在物体的shader中而不是地面的shader。下面要讲的球体阴影的shader是放在要接受阴影的地面上。 原理如下图&am…

css html 抽屉,CSS快速入门-前端布局1(抽屉)(示例代码)

一、效果图前面对CSS基础知识有了一定的了解&#xff0c;是时候开始实战了&#xff01;以下我对抽屉(https://dig.chouti.com/)主页进行模拟布局。官方网站效果图&#xff1a;模拟网站图&#xff1a;二、实现步骤1、整体布局(header、body、footer)抽屉的首页主要分为三块&…

11.Wave Shader

这个shader是在这位博主点击打开链接的文章基础上进行修改得到的&#xff0c;原作是在shadertoy网站上。不得不说&#xff0c;被shadertoy上的大神们震精了&#xff0c;真的是令我叹为观止&#xff0c;啥也不说了&#xff0c;慢慢学吧。 shader的效果&#xff1a; Shader的代码…

macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝

12月15日消息&#xff0c;早在6月4号WWDC全球开发者大会上就已经发布的新版Mac Pro电脑&#xff0c;近期正式上架苹果官网开销&#xff0c;某一外媒在收到2019年新版Mac Pro后&#xff0c;第一件事竟不是体验其性能&#xff0c;而是验证它是否可以用来给土豆或者奶酪刨丝。在视…

12.屏幕高斯模糊

本系列文章由浅墨_毛星云 出品&#xff0c;转载请注明出处。 文章链接&#xff1a; http://blog.csdn.net/poem_qianmo/article/details/51871531 作者&#xff1a;毛星云&#xff08;浅墨&#xff09; 微博&#xff1a;http://weibo.com/u/1723155442 本文工程使用的Uni…

广东东软学院计算机系主任罗,广东东软学院副校长朱爱红一行来访我校

3月27日&#xff0c;广东东软学院副校长朱爱红、教务部部长程江涛、品牌发展部部长李惠旋、计算机学院院长黄迅、SOVO主任吴志成、网络与信息中心主任付冬波、实验教学中心主任谢振华、图书馆馆长刘春林等一行18人来访我校。我校副校长郭权接待来访嘉宾。嘉宾一行参加调研会议嘉…

事业单位职称工资计算机,终于!事业单位绩效工资、职称变了!关系上千万人收入!...

原标题&#xff1a;终于&#xff01;事业单位绩效工资、职称变了&#xff01;关系上千万人收入&#xff01;大学生热烈追捧事业单位和公务员&#xff0c;并将其称为铁饭碗&#xff01;有很多大学生们在大学毕业之后就选择了去考公务员或者事业单位&#xff01;甚至不少同学甚至…

remove是什么意思计算机语言,remove是什么意思?remove是什么意思?

remove()是C语言中的函数&#xff0c;一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。函数功能remove()函数用于删除指定的文件&#xff0c;其原型如下&#xff1a;int remove(char *filename);函数声明2&#xff1a;templateinline bool remov…

Unity3D_NGUI_安卓APK安装包瘦身实践

减包瘦身是个精细活。本文整理了0907版本操作过程&#xff0c;以备日后参考。 经过一番折腾&#xff0c;各位攻城狮的努力&#xff0c;美术设计师的支持&#xff0c;策划爷的理解&#xff0c;UI资源&#xff08;图集、字体、单局外模型贴图&#xff09;从45.4MB减少到24.5MB。如…

Unity3D之Shader自定义编辑器功能拓展

一、前言最近在开发一个关卡类的游戏&#xff0c;在导入一些3D物体的时候&#xff0c;发现很多时候同一个3D物体需要渲染的方式不一样&#xff0c;比如这颗树要双面渲染&#xff08;Cull Off&#xff09;&#xff0c;但在很多情况下是可以剔除背面&#xff08;Cull Back&#x…

理解依赖注入(IOC)

IOC:英文全称&#xff1a;Inversion of Control&#xff0c;中文名称&#xff1a;控制反转&#xff0c;它还有个名字叫依赖注入&#xff08;Dependency Injection&#xff09;。 作用&#xff1a;将各层的对象以松耦合的方式组织在一起&#xff0c;解耦&#xff0c;各层对象的调…

局域网win7计算机如何互访,局域网win7电脑的互访步骤

局域网win7电脑的互访步骤Windows7如何实现局域网内的互访?下面是局域网win7电脑互访的步骤&#xff0c;为大家提供参考。步骤一&#xff1a;同步工作组 不管使用的是什么版本的Windows操作系统&#xff0c;第一步&#xff0c;要保证联网的各计算机的工作组名称一致步骤二&…

服务器自动挂载硬盘,Linux硬盘分区及开机自动挂载

本文以CentOS 6.4为例&#xff0c;查看当前linux服务器分区&#xff1a;df -h查看当前linux服务器硬盘&#xff1a;fdisk -l/dev/sda 第一块硬盘/dev/sdb 第二块硬盘依此类推以/dev/sdb为新增硬盘为例&#xff0c;需要进行以下操作方可正常使用1、分区fdisk /dev/sdb依次输入n&…

GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation

最近时间多了起来&#xff0c;准备捡起扔下了的渲染部分的知识。想拜读下GPU Pro系列并且做个笔记&#xff0c;不知道自己能否坚持下来&#xff0c;但愿可以吧。自己能力也有限&#xff0c;写的东西也只是自己的理解&#xff0c;肯定有很多理解不到位甚至错误的地方&#xff0c…

GPU Pro2 - 3.Procedural Content Generation on the GPU

GPU Pro2 - 3.Procedural Content Generation on the GPU 这篇文章着重介绍了基于Brownian 噪声和高度图在GPU中实时生成和渲染无限大地形系统。 Procedural content generation (PCG)程序化生成在许多游戏中已经有广泛应用&#xff0c;从简单的随机物体摆放&#xff0c;到全…

GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)

该读书笔记大多内容参照了大神浅墨的该篇文章https://zhuanlan.zhihu.com/p/35974789 本章介绍了一种在GPU中模拟和渲染大的水体的系统。它把基本网格的集合波动于动态发现贴图的生成结合起来。 1.1 目标和范围 这章里&#xff0c;我们将由计算简单正弦函数之和开始&#xf…

GPU Gems1 - 2 水刻蚀的渲染

2.1 引言 光线从弯曲的表面反射或折射&#xff0c;因此只聚焦在受光面上的某些区域&#xff0c;于是就产生了刻蚀现象。本文从美学角度出发&#xff0c;不以纯物理的方式计算&#xff0c;使其很容易在大多数图形硬件上实现&#xff0c;效果又十分逼真。 2.2 刻蚀的计算 如果想…

邮箱服务器ip地址白名单,申请SSL证书时如何设置IP地址白名单和邮箱白名单

8月3日消息 在申请SSL证书时&#xff0c;由于您的邮箱可能默认设置或自定义设置了拦截国外邮件&#xff0c;可能会导致您接收不到CA的邮件&#xff0c;给验证、收取证书带来了不便&#xff1b;如果服务器&#xff0c;防火墙也设置了拦截操作&#xff0c;那么即使您按CA要求完成…