Unity shader学习之高光反射光照模型
高光反射光照模型的公式如下:
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学习之高光反射光照模型的更多相关文章
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- 【Unity Shader学习笔记】Unity光照基础-高光反射
1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...
- Unity shader学习之Blinn-Phong光照模型
Blinn-Phong光照模型不用计算反射方向,计算公式如下: h = normalize(v + l); Cspecular = Clight * mspecular * pow(max(0, do ...
- 【Unity Shader学习笔记】Unity基础纹理-法线贴图
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...
- 【Unity Shader学习笔记】Unity基础纹理-单张纹理
1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...
- 【Unity Shader学习笔记】Unity基础纹理-渐变纹理
纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因 ...
随机推荐
- springmvc整合spring+mybatis出现的404或者报找不到这个类的时候。
1.文件配置没有问题的时候看这个看看.输出目录改成这个.要有这里所有的目录才行
- vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 我怕链 ...
- [daily][tcpdump] tcpdump查找reset包
tcpdump -r xxxx.pcap 'tcp[tcpflags] & tcp-rst != 0'
- python循环字符转换
pyhon函数传参的时候穿的是引用,而不是实际值,这样可以节省内存 变量名要求:最好是以字母下划线作为变量名,不能和py关键字重复 import getpass提供了平台无关的在命令行下输入密码的方法 ...
- charles4.2下载与破解方法以及配置https
Charles的使用方法 Charles下载地址 地址:https://www.charlesproxy.com/latest-release/download.do 2. Charles破解 破解地 ...
- linux read()和write
参考http://www.cnblogs.com/xiehongfeng100/p/4619451.html 1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满 ...
- Magento 2数据库EAV模型结构
EAV模型是一种数据模型 ,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多. Magento 2这么设计是为了灵活性,在不影响主干的基础上,任意新增删除属性. EAV模型(E ...
- iOS添加pch文件
1.第一步,创建pch文件 第二步设置pch文件:相对地址,填写$(SRCROOT)/YTCompleteCarSell/PrefixHeader.pch $(SRCROOT)是项目地址/项目名/p ...
- mac-破解2018 webstorm
参考链接:https://blog.csdn.net/pariese/article/details/77540069 后续待整理
- element
<el-table-column label="地址" prop="address"> <template slot-scope=" ...