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

  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. [hyperscan][pkg-config] hyperscan 从0到1路线图

    经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...

  2. 玩具装箱&土地购买

    今天一天8h 写了两道斜率优化的题(别问我效率为什么这么低 代码bug太多了) 关键是思考的不周全 估计是写的题少手生 以后就会熟练起来了吧. 这道题显然有一个n^2的dp方程 设f[i]表示前i件物 ...

  3. 4QC(四象限变流器)

    1.什么是4QC? 4QC又叫四象限整流器 它是全控型晶闸管的整流电路,现在一般用水冷的IGBT组成的整流电路,它可以调节电压和电流,所谓的四象限就是 u+,i+,为第一象限: u-,i+.,为第二象 ...

  4. JavaWeb开发如何用Tomcat部署发布

    一.如何安装TomCat 1.1安装包下载地址:https://tomcat.apache.org/download-70.cgi 1.2  安装exe文件,下一步直到安装成功.并启动Tomcat服务 ...

  5. 7620N路由器刷openwrt系统并配置***

    之前一直用goAgent***,主要用gmail.逛逛twitter.youtube.维基百科.加速stackoverflow等等.但goAgent只能PC使用,手机.iPad都不能用,直到我拿到了一 ...

  6. centos删除用户出错userdel: user xxx is currently used by process 23750

    今天ytkah管理centos用户准备删除某个用户时出错了,提示userdel: user xxx is currently used by process 23750,这是因为xxx用户还在登陆中, ...

  7. ul+li水平居中的几种方法

    一.posotion:relative; 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  8. Jsp与Servlet面试题

    一.jsp有哪些内置对象作用分别是什么  答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): request  用户端请求,此请求会包含来自GET/POST请求的参数  respo ...

  9. [django]modelform实现的多文件上传

    实现效果 代码 models.py from django.db import models import uuid class UUIDTools(object): ""&quo ...

  10. Python socketserver模块解析

    参考:https://blog.csdn.net/qq_33733970/article/details/79153938 1.功能简介 socketserver模块是对socket模块的再封装,用于 ...