Unity3D ShaderLab 漫反射卷积光照模型
Unity3D ShaderLab 漫反射卷积光照模型
漫反射卷积【Diffuse convolution】是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节。
这种效果在我们要活得一个更具全局光照表面效果的时候非常有用。
为了实现这种效果,我们需要创建一个卷积运算的立方图。比如ATI的工具制作CubeMapGen。
下载地址:
http://developer.amd.com/tools-and-sdks/archive/legacy-cpu-gpu-tools/cubemapgen/

安装完毕后,我们通过右上角的LoadBasemap,LoadCubeMap配置贴图,在设置一下FilterType,Filter Angle等参数后点击右下角的FilterCubeMap按钮。
等待一会就可以Filter完成,点击Save CubeMap to Images按钮,就可以保存我们的立方体图了。
然后就是新建Shader,Material。双击脚本,计入编辑器模式。
1>修改Properties:
Properties {
_MainTint("Global Tint",Color)=(,,,)
_BumpMap ("Normal Map", 2D) = "bump" {}
_AOMap("Ambient Occlusion Map",2D)="white"{}
_CubeMap("Diffuse Convolution CubeMap",Cube)=""{}
_SpecIntensity("Specular Intensity",Range(,))=0.4
_SpecWitdth("Specular Width",Range(,))=0.2
}
2>修改SubShader变量
CGPROGRAM
#pragma surface surf DiffuseConvolution
#pragma target 3.0
samplerCUBE _CubeMap;
sampler2D _BumpMap;
sampler2D _AOMap;
float4 _MainTint;
float _SpecIntensity;
float _SpecWitdth;
struct Input {
float2 uv_MainTex;
float2 uv_AOMap;
float3 worldNormal;
INTERNAL_DATA
};
我们需要模型的世界法线,所以加入INTERNAL_DATA。因为着色器包含一张法线贴图,我们使用它获得修改后的法线。
3>完成光照函数
inline fixed4 LightingDiffuseConvolution(SurfaceOutput s,fixed3 lightDir,fixed3 viewDir,fixed atten){
//计算光照向量;
viewDir = normalize(viewDir);
lightDir = normalize(lightDir);
s.Normal = normalize(s.Normal);
float NdotL = dot(s.Normal,lightDir);
float3 halfVec = normalize(lightDir+viewDir);
//计算高光;
float spec = pow(dot(s.Normal,halfVec),s.Specular*)*s.Gloss;
//光照模型赋值;
fixed4 c;
c.rgb = (s.Albedo*atten)+spec;
c.a = ;
return c;
}
4>surf处理贴图
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_AOMap, IN.uv_AOMap);
float3 normals = UnpackNormal(tex2D(_BumpMap,IN.uv_AOMap)).rgb;
o.Normal = normals;
float3 diffuseVal = texCUBE(_CubeMap,WorldNormalVector(IN,o.Normal)).rgb;
o.Albedo = (c.rgb*diffuseVal)*_MainTint;
o.Specular = _SpecWitdth;
o.Gloss = _SpecIntensity*c.rgb;
o.Alpha = c.a;
}
完成了光照函数后,使用模型的世界法线来对卷积后的立方图进行纹理映射,然后把结果传入output结构体。
返回Unity编辑器,最终效果如下:

通过上面的函数,我们首先得到被法线贴图修改后的模型的世界法线,并利用法线数据来查找立方图上的位置以得到他的像素和颜色,
这就是我们要在Input结构体重申明float3 worldNormal,以及INTERNAL_DATA原因。
然后我们使用WorldNormalVector函数来得到最终的法线向量,并用于texCUBE的检索。
Shader "91YGame/CubeMapLight" {
Properties {
_MainTint("Global Tint",Color)=(,,,)
_BumpMap ("Normal Map", 2D) = "bump" {}
_AOMap("Ambient Occlusion Map",2D)="white"{}
_CubeMap("Diffuse Convolution CubeMap",Cube)=""{}
_SpecIntensity("Specular Intensity",Range(,))=0.4
_SpecWitdth("Specular Width",Range(,))=0.2
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD
CGPROGRAM
#pragma surface surf DiffuseConvolution
#pragma target 3.0
samplerCUBE _CubeMap;
sampler2D _BumpMap;
sampler2D _AOMap;
float4 _MainTint;
float _SpecIntensity;
float _SpecWitdth;
struct Input {
float2 uv_MainTex;
float2 uv_AOMap;
float3 worldNormal;
INTERNAL_DATA
};
inline fixed4 LightingDiffuseConvolution(SurfaceOutput s,fixed3 lightDir,fixed3 viewDir,fixed atten){
//计算光照向量;
viewDir = normalize(viewDir);
lightDir = normalize(lightDir);
s.Normal = normalize(s.Normal);
float NdotL = dot(s.Normal,lightDir);
float3 halfVec = normalize(lightDir+viewDir);
//计算高光;
float spec = pow(dot(s.Normal,halfVec),s.Specular*)*s.Gloss;
//光照模型赋值;
fixed4 c;
c.rgb = (s.Albedo*atten)+spec;
c.a = ;
return c;
}
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_AOMap, IN.uv_AOMap);
float3 normals = UnpackNormal(tex2D(_BumpMap,IN.uv_AOMap)).rgb;
o.Normal = normals;
float3 diffuseVal = texCUBE(_CubeMap,WorldNormalVector(IN,o.Normal)).rgb;
o.Albedo = (c.rgb*diffuseVal)*_MainTint;
o.Specular = _SpecWitdth;
o.Gloss = _SpecIntensity*c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Unity3D ShaderLab 漫反射卷积光照模型的更多相关文章
- Unity3D ShaderLab Half Lambert光照模型
Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ...
- Unity3D ShaderLab 车辆喷漆光照模型实战
这一篇,我们来创建一个车辆喷漆的光照模型.首先就是准备场景,新建Shader & Material. 过程比较简单,直接看完成的代码吧: Shader "91YGame/CarOut ...
- Unity3D ShaderLab 静态贴图光照模型
Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...
- Unity3D ShaderLab 创建自定义高光类型
Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数 ...
- Unity3D ShaderLab 使用渐变纹理着色
Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片 ...
- Unity3D ShaderLab 立方体图的菲涅尔反射
Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...
- Unity3D ShaderLab 各向异性高光
Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...
- Unity3D ShaderLab 使用贴图对模型的高光进行遮罩
Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...
- Unity3D ShaderLab 使用BlinnPhong高光类型
Unity3D shaderLab 使用BlinnPhong高光类型 上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所 ...
随机推荐
- Xcode 8 打包上线 iTunes Connect 找不到构建版本
Xcode 8 打包上线 iTunes Connect 找不到构建版本 最近苹果推出新的mac操作系统(macOS Sierra 10.12),大家可能都已经升级了,作为一个开发者,小编肯定是第一时间 ...
- 批次更新BAPI_OBJCL_CHANGE
FORM frm_edit_batch TABLES pt_field STRUCTURE dfies USING ps_batch TYPE ty_batch CHANGING ps_rturn T ...
- JavaScrip的DOM操作(13号讲)
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型,文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西 2.Windows对象操作 一.属性和方法 二.Window.open(& ...
- Java: constructor 构造代码块
构造器与类同名 每个类可以有1一个以上的构造器 构造器可以有0个,1个或者多个参数 构造器没有返回值,不可以写return 构造器总是伴随着new操作一起调用 构造函数的作用:可以用于给对象进行初始化 ...
- JAVA EE企业级开发四步走完全攻略 [转]
http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...
- [Js]面向对象基础
一.什么是对象 对象是一个整体,对对外提供一些操作 二.什么是面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如Jquery 三.Js中面向对象的特点 1.抽象:抓住核心问题 2.封装 ...
- js基础之动画(三)
一.链式运动 首先,要改进运动框架 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; ...
- 转: HTTP协议的头信息详解
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可 选的消息体组成.HTTP的头域包括通用头,请求头,响 ...
- 浅谈C++源码的过国内杀软的免杀
以下只是简单的思路和定位.也许有人秒过,但是不要笑话我写的笨方法.定位永远是过期不了的. 其实这里废话一下 , 本人并不是大牛 ,今天跟大家分享下 .所以写出这篇文章.(大牛飘过) 只是个人实战的经验 ...
- bzoj 2243: [SDOI2011]染色
#include<cstdio> #include<iostream> #define M 1000006 #define N 1000006 using namespace ...