高光反射光照模型的公式如下:

  Cspecular = Clight * mspecular * max(0, dot(v, r))gloss

要计算高光反射需要知道4个参数:入射光线颜色Cspecular,材质高光反射系数gloss,视角方向v和反射方向r

其中r可由cg函数reflect(i, n)求得。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7088297.html

逐顶点高光反射shader如下:

 Shader "Custom/Specular Vertex-Level"
{
Properties
{
_Diffuse ("Diffuse Color", Color) = (,,,)
_Specular ("Specular Color", Color) = (,,,)
_Gloss ("Gloss", Range(, )) =
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
Tags { "LightMode"="ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "Lighting.cginc" struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
}; fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); // specular
float3 lightDir = ObjSpaceLightDir(v.vertex);
lightDir = normalize(lightDir);
float3 nor = normalize(v.normal);
float3 refLightDir = reflect(-lightDir, nor);
refLightDir = normalize(refLightDir);
float3 viewDir = ObjSpaceViewDir(v.vertex);
viewDir = normalize(viewDir);
float d = max(, dot(refLightDir, viewDir));
float3 specColor = _LightColor0.rgb * _Specular.rgb * pow(d, _Gloss); // diffuse
float3 diffuseColor = _LightColor0.rgb * _Diffuse.rgb * max(, dot(lightDir, nor)); float3 c = specColor + diffuseColor + UNITY_LIGHTMODEL_AMBIENT.rgb; o.color = float4(c, ); return o;
} fixed4 frag (v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
}
}

Custom/Specular Vertex-Level

逐像素高光反射shader如下:

 Shader "Custom/Specular Fragment-Level"
{
Properties
{
_Diffuse ("Diffuse Color", Color) = (,,,)
_Specular ("Specular Color", Color) = (,,,)
_Gloss ("Gloss", Range(, )) =
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
Tags { "LightMode"="ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "Lighting.cginc" struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
}; struct v2f
{
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
}; fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
// specular
float3 worldNormal = normalize(i.worldNormal);
float3 lightDir = UnityWorldSpaceLightDir(i.worldPos);
lightDir = normalize(lightDir);
float3 refLightDir = reflect(-lightDir, worldNormal);
refLightDir = normalize(refLightDir);
float3 viewDir = UnityWorldSpaceViewDir(i.worldPos);
viewDir = normalize(viewDir);
float d = max(, dot(refLightDir, viewDir));
float3 spec = _LightColor0.rgb * _Specular.rgb * pow(d, _Gloss); // diffuse
float3 diff = _LightColor0.rgb * _Diffuse.rgb * max(, dot(lightDir, worldNormal)); float3 c = spec + diff + UNITY_LIGHTMODEL_AMBIENT.rgb;
return fixed4(c, );
}
ENDCG
}
}
}

Custom/Specular Fragment-Level

效果分别如下:

Unity shader学习之高光反射光照模型的更多相关文章

  1. 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现

    [Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...

  2. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  3. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  4. 【Unity Shader学习笔记】Unity光照基础-高光反射

    1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...

  5. Unity shader学习之Blinn-Phong光照模型

    Blinn-Phong光照模型不用计算反射方向,计算公式如下: h = normalize(v + l); Cspecular = Clight * mspecular * pow(max(0, do ...

  6. 【Unity Shader学习笔记】Unity基础纹理-法线贴图

    1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...

  7. 【Unity Shader学习笔记】Unity基础纹理-单张纹理

    1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...

  8. Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

    一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...

  9. 【Unity Shader学习笔记】Unity基础纹理-渐变纹理

    纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因 ...

随机推荐

  1. [knowledge][dpdk] open data plane

    https://www.opendataplane.org/ https://en.wikipedia.org/wiki/OpenDataPlane odp vs dpdk:  http://dpdk ...

  2. ehlib预览打印的使用

    ehlib支持预览打印功能,可以省去重新制作报表的麻烦,经过一天的努力,基本上解决了这个问题.把解决方法写出来,同行的朋友可以参考,同时为自己做个学习笔记.     首先,需要放置PrintDBGri ...

  3. Qt5线程错误:QThread: Destroyed while thread is still running(执行runThread->exit(0))

    背景: 当前类,编写接收子线程类信号的槽函数和触发子线程类执行的信号: 新建一个子线程类,编写槽函数和信号,MyClass *m_MyClass=new MyClass(): 新建一个线程对象QThr ...

  4. IDEA指定启动JDK版本

    使用场景: 开发人员在自己的机器上可能装了多个版本的JDK,但是在环境变量中只能配置一个 JAVA_HOME ,so你的IDEA Eclipse 可能因为你在 JAVA_HOME 配置JDK1.8 以 ...

  5. tensorflow入门笔记(五) name_scope和variable_scope

    一.上下文管理器(context manager) 上下文管理器是实现了上下文协议的对象,主要用于资源的获取与释放.上下文协议包括__enter__.__exit__,简单说就是,具备__enter_ ...

  6. 原生js获取到页面上所有的checkbox

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  7. push问题1

    问题: $ git pushTo gitee.com:kekemuyu/xtpole.git ! [rejected] master -> master (fetch first)error: ...

  8. java JDBC (六) org.apache.commons.dbutils 增删改

    dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...

  9. Entity Framework学习 - 5.DB First执行时提示model没有key

    原因:自动生成的类中有关联主键,没有自动生成Key及Column 解决方法:在xxx.tt的66行左右修改为 var simpleProperties = typeMapper.GetSimplePr ...

  10. java装配bean

    java装配bean,可以自动装配,也可以显式装配: 1.通过组件扫描自动装配bean 因为使用了Configuration注解,表明这个类是一个配置类,该类应该包含在spring应用上下文如何创建b ...