Unity3D ShaderLab BRDF模拟
Unity3D ShaderLab BRDF模拟
在上一篇,说到了使用渐变纹理着色,使用一个值来控制纹理的uv坐标,但是这也就表示我们只能得到一个线性的光照效果。
那么我们能不能通过观察方向的向量结合光照方向形成双向的反射变化呢,既然说到这里,肯定是可以做到的,
这就是我们的BRDF effect,我们可以简单的把BRDF看作为入射光在不透明物体表面同时反射到观察方向和出射光方向。
BRDF(Bidirectional Reflectance Distribution Function具体的内容讲解,可以查阅百度百科。
光线照到一个物体,首先产生反射,吸收和透射,所以BRDF的关键因素即为多少光被反射、吸收和透射(折射)了,是怎样变化的,同学你的初中物理哦。
我们先讨论效果的模拟实现,如何利用多变的纹理来变化我们的模型效果。
开始code之前,我们需要一个多维度的渐变纹理,所以至少3个方向的渐变色域。
这一次,我们借用上一篇使用渐变纹理着色的code【BasicMyHalfLessDiffuse】,我们要把之前的inline float4 LightingHalfBRDFDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)函数修改为4个参数
1:>inline float4 LightingHalfBRDFDiffuse(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
2:加入视角的观察方向参数>float rimLight = max(0,dot(s.Normal,viewDir));
3:修改通过txt2D()函数获得的rgb>tex2D(_BRDFTex,float2(halfLight,rimLight)).rgb;

上图就是我们修改完毕的光照模型函数了。那么最后的渲染结果是什么样的呢。

请注意,_EmissiveColor,_AmbientColor都是白色哦。我们确实是借助图片的渐变色来实现而已,在上面的效果中,我们主要是展现了更多变的rgb对模型的渲染效果。
总结上面的过程,在我们使用观察方向参数时候,我们可以创建一个简单的衰减效果,我们可以通过不同的衰减的形式制作出各种效果。
由于rimLight,difLight的结果都是0-1,所以我们可以使用这两个值来选择渐变的不同区域。那么最关键的就是理解我们从点乘运算获得的值,以及如何控制纹理。
code start------------------------------------------------------------
Shader "91YGame/BasicMyHalfBRDFDiffuse" {
Properties {
_EmissiveColor("Emissive Color",Color) = (,,,)
_AmbientColor("Ambient Color",Color)=(,,,)
_MySliderValue("Slider Value",Range(,))=1.3
_BRDFTex ("BRDF Texture", 2D) = ""
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD
CGPROGRAM
//#pragma surface surf Lambert
#pragma surface surf HalfBRDFDiffuse
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
sampler2D _BRDFTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float4 c;
c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
inline float4 LightingHalfBRDFDiffuse(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten){
float difLight = max(,dot(s.Normal,lightDir));
float rimLight = max(,dot(s.Normal,viewDir));
float halfLight=difLight*0.5+0.5;
float3 bfColor = tex2D(_BRDFTex,float2(halfLight,rimLight)).rgb;
float4 col;
col.rgb = s.Albedo * _LightColor0.rgb*bfColor;
col.a=s.Alpha;
return col;
}
ENDCG
}
FallBack "Diffuse"
}
code end--------------------------------------------------------------
Unity3D ShaderLab BRDF模拟的更多相关文章
- Unity3D ShaderLab 模拟精灵动画
Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...
- Unity3D ShaderLab 模拟纹理运动
Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...
- Unity3D ShaderLab 简单的立方体图反射
Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...
- Unity3D ShaderLab 各向异性高光
Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...
- Unity3D ShaderLab法线贴图
Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...
- Unity3D ShaderLab 修改渲染队列进行深度排序
Unity3D ShaderLab 修改渲染队列进行深度排序 为了更深刻的理解透明度,我们还需要学习一下深度排序,简单来说就是物体被渲染的先后顺序. Unity允许我们通过代码来控制某个特定物体渲染到 ...
- Unity3D ShaderLab 透明裁剪着色器
Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...
- Unity3D ShaderLab 布料着色器
Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...
- Unity3D ShaderLab 漫反射卷积光照模型
Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...
随机推荐
- 《Play for Java》学习笔记(四)Controller
play的一大优势是可以将HTTP映射到JAVA API代码(Type-safe mapping from HTTP to an idiomatic Scala or Java API),完美的实现了 ...
- BZOJ1722 [Usaco2006 Mar] Milk Team Select 产奶比赛
直接树形dp就好了恩 令$f[i][j][t]$表示以$i$为根的子树,选出来的点存在$j$对父子关系,$t$表示$i$这个点选或者没选,的最大产奶值 分类讨论自己和儿子分别有没有选,然后转移一下就好 ...
- ACTIVITI 表结构数据分析
ACTIVITI ACT_RU_EXECUTION 表 这个表是工作流程的核心表,流程的驱动都和合格表有密切的关系. 一般来讲一个流程实例都有一条主线.如果流程为直线流程,那么流程实例在这个表 ...
- PHP分页类库
<?php /** * @title: Ekcms page分页类库 * @version: 1.0 * @author: perry <perry@1kyou.com> * @pu ...
- PHP 多线程扩展(正儿八经的线程)pthreads安装
环境CentOS 6.3 64bit,php 5.4.5 pthreads需要线程安全环境, 下载php的安装包,解压: tar zxvf php-5.4.5.tar.gz//名字是不是这个我不确定, ...
- spring任务计划
小组 第一次小组会议结果 贾川和刘三龙负责这些任务: 1:4.11 搭配开发必要的环境,vs2010 2:4.12学习windows界面开发的基本知识 3:4.13-4.15 和小组成员讨论软件界面的 ...
- winform的comboBox使鼠标滑轮修改值失效
目标: winform窗体很多combobox下拉框,当他们其中的一个获得焦点的时候,如果滚动鼠标就会改变下拉框的值,要实现让鼠标滚轮不对下拉框的值造成影响 如下代码直接拷贝粘贴,不用修改 方法一: ...
- Validform自定义提示效果-使用自定义弹出框
$(function(){ $.Tipmsg.r=null; $("#add").Validform({ tiptype:function(msg){ layer.msg(msg) ...
- 《算法竞赛入门经典》5.12TeX括号
/* *在TeX中,左双引号是``,右双引号是''.输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. *样例输入:"To be or not to be,"quoth ...
- struts2 ModelDriven 和 Preparable 拦截器
Struts2 运行流程图-1