高光反射又叫做镜面反射:用于模拟有光泽物体的上面出现的光点。高光反射的颜色相比于物体的颜色会更倾向与光的颜色。(漫反射:模拟光源对物体的方向性影响。)

首先是Phong光照模型:

公式:

v是视角方向,r是反射方向,Mgloss是高光系数,Mdiffuse是高光反射颜色

逐顶点光照实现Phong代码:

Shader "Custom/Phong"
{Properties{_Color("_Color",Color) = (1,1,1,1)   //高光的颜色_Range("_Range", Range(0.0, 10.0)) = 2.0  //高光的范围}SubShader{Pass{CGPROGRAM#pragma vertex vert
#pragma fragment frag #include "Lighting.cginc" float4 _Color;float _Range;struct a2v{float4 position:POSITION;//将模型空间下的位置坐标填充给positionfloat3 normal:NORMAL;//将模型空间下的顶点法线填充normal};struct v2f{float4 position:SV_POSITION;float3 color:COLOR;};v2f vert(a2v v){v2f f;//将顶点由模型空间转化到裁剪空间f.position = UnityObjectToClipPos(v.position);float4 vertexPos = mul(v.position,(float4x4)unity_WorldToObject);//获取视野方向float3 cameraDir = normalize(_WorldSpaceCameraPos.xyz - vertexPos);//获取灯光方向float3 lightDir = WorldSpaceLightDir(vertexPos);float3 normalDir = normalize(mul(v.normal,(float3x3)unity_WorldToObject));//获取反射光位置float3 reflectDir = normalize(reflect(-lightDir,normalDir));//使用Phong模型float3 specular = _LightColor0.rgb * pow(max(dot(reflectDir,cameraDir),0),_Range) * _Color;//半兰布特模型float3 diffuse = _LightColor0.rgb * max(dot(lightDir,normalDir),0)*_Color * 0.5 + 0.5;f.color = specular + UNITY_LIGHTMODEL_AMBIENT.rgb + diffuse;return     f;}fixed4 frag(v2f f) : SV_Target{return fixed4(f.color,1);}ENDCG}}Fallback "Diffuse"
}

Blinn-Phong光照模型,没有使用反射方向。引入了h

公式如下:

逐像素光照实现Blinn-Phong代码:

Shader "Custom/Specular Blinn-Phong"
{Properties{_Color("SpecularColor",Color) = (1,1,1,1)    //高光的颜色_Range("Gloss",Range(8.0,256)) = 20           //高光的范围}SubShader{Tags{"RenderType" = "Opaque"}Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;};float4 _Color;float _Range;v2f vert(a2v v){v2f  o;//将顶点由模型空间转化到裁剪空间o.vertex = UnityObjectToClipPos(v.vertex);//将法线从模型空间转化到世界空间o.worldNormal = UnityObjectToWorldNormal(v.normal);//用于将当前顶点/方向矢量从模型空间变换到世界空间o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target{//得到环境光float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 normalDir = normalize(i.worldNormal);float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//得到漫反射的颜色(半兰布特模型)float3 diffuseColor = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDir, lightDir)) * 0.5 + 0.5;//得到视线方向float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);//用于替换到Phong中的得到的出射光float3 halfDir = normalize(lightDir + viewDir);float3 specularColor = _LightColor0.rgb * _Color.rgb * pow(max(0, dot(halfDir, normalDir)), _Range);fixed4 col =  float4 ((ambient + diffuseColor + specularColor), 1);return col;}ENDCG}}FallBack "Specular"
}

效果图:

结语:Blinn-Phong光照模型它将计算反射向量的过程替换为计算视线和光线的半角向量,提高了运算速度,它的效果比较平滑,运算速度快。

Shader实现高光反射相关推荐

  1. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  2. Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数

    1 高光反射光照模型计算公式 从公式可以看出,要计算高光反射需要知道 4 个参数:入射光线的颜色和强度c,材质的光反射系数 m,视角方向v以及反射方向r.其中,反射方向r可以由表面法线n和光源i计算得 ...

  3. Unity Shader标准光照模型——高光反射

    高光反射 顶点高光反射 Shader "Unlit/HighLightReflection" {Properties{_diffuse("diffuse",Co ...

  4. Unity Shader知识点(三)高光反射Shader

    前言 此文及专栏系是以Shader入门精要为基础整理的Unity Shader学习笔记,尽量以初学者视角还原(其实半年前我就是初学者),错误还需指正. 本篇是实操部分的第三个Shader,即高光反射S ...

  5. shader基础学习摘要(三)高光反射

    高光反射 理论推导 代码实践 Phone光照模型 逐顶点 逐像素 Blinn-Phong光照模型 内置函数 理论推导 在6.2.4节中,我们给出了基本光照模型中高光反射部分的计算公式 高光反射求的夹角 ...

  6. Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型

    我们是如何看到这个世界的 从宏观上来说,渲染包含了两大部分 决定一个像素的可见性 决定这个像素上的关照计算 而光照模型就是用于决定一个像素上进行怎样的光照计算 通常来讲,我们要模拟真实的光照环境来生成 ...

  7. Unity Shader 高光反射光照模型

    高光反射光照模型计算公式如下: 需要四个参数:入射光线的颜色和强度,材质的高光反射系数,视角方向,反射方向. 反射方向可以由表面法线和光源方向计算而得: 也可以直接使用CG提供的计算反射方向的函数re ...

  8. specular图使用方法_Unity| Specular高光反射初探(上)

    哈喽,上次我们有分享过Diffuse漫反射的基本光照原理Unity | Diffuse Light漫反射光照,现在我们来聊一下另外一个反射,specular镜面或者高光反射. 在OpenGL中,光照使 ...

  9. 10.高光反射Blinn

    高光反射的公式: Specular = 直射光 * pow(cosθ,高光的参数) θ是反射光方向和视野方向的夹角 由图像看出高光参数可控制光的可视范围 逐顶点的高光反射 // Upgrade NOT ...

最新文章

  1. RDKit | 基于不同描述符和指纹的机器学习模型预测logP
  2. 云计算和大数据时代网络技术揭秘(六)LISP协议
  3. 机器学习导论(张志华):渐近性质
  4. 系统弹出菜单类名是固定的. #32769
  5. boat启动器 minecraft_minecraft boat
  6. 静止一秒_生命静止前的那一秒,我们并不是无能为力...
  7. bzoj 4002: [JLOI2015]有意义的字符串(特征根法+矩阵快速幂)
  8. android 炫飞 打印机,手机拍照打印机推荐 佳能炫飞CP1200打印机介绍【详解】
  9. 学Python运维,这知识点你肯定会遇到,【必收藏之】nginx 域名跳转相关配置
  10. JAVA死磕系列 疯狂创客圈
  11. 弘辽科技:手淘客是什么意思?如何去查看?
  12. Context Menus
  13. xlrd读取多个sheets
  14. Caffe中BN层与CONV层的融合(merge_bn)
  15. 普及游戏:小型团队如何赢得大赛
  16. FCoin币改试验区(主版C)筹备公告(5号)
  17. 《Large scale GAN training for high fidelity natural image synthesis》论文阅读记录
  18. 快排为什么一定要从右边开始?
  19. 【备忘】Word在任意第M-N页间插入页码
  20. 中国第一代程序员列传

热门文章

  1. bilibili学习
  2. Figma#1: 图形绘制
  3. 登录注册小程序(JAVA基础案例教程第二章-课后作业)
  4. DQ坐标轴锁相环(pll)
  5. Mysql中Drop删除用户的名字_mysql中drop和delete方法删除用户的区别
  6. android studio linux 字体,Android Studio代码字体模糊解决方法
  7. 老师的好帮手——课堂考勤记录整合
  8. 若依登录和JWT验证的大体流程和对redis的使用
  9. C# Windows获取系统路径汇总
  10. ZYNQ开发之BootROM加载