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]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...
随机推荐
- Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Hadoop 添加删除数据节点(datanode)
前提条件: 添加机器安装jdk等,最好把环境都搞成一样,示例可做相应改动 实现目的: 在hadoop集群中添加一个新增数据节点. 1. 创建目录和用户 mkdir -p /app/hadoop gr ...
- css hack整理:区别FF,IE8,IE7,IE6,SF,CH浏览器
css hack整理:区别FF,IE8,IE7,IE6,SF,CH浏览器 2013年03月24日 ⁄ CSS ⁄ 共 716字 ⁄ 暂无评论 前端开发最要命的事就是处理浏览器的兼容性问 ...
- uva 1631
1631 Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can ro ...
- attachEvent ,addEventListener
if (window.attachEvent) { window.attachEvent("onload", remove); ...
- FZU 1914 Funny Positive Sequence
题目链接:Funny Positive Sequence 题意:给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个数列的这n种变换里, A(0): a1, ...
- oracle查询语句大全
1.查处oracle数据库的字符编码格式 select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET'; 如果查出的是ZH ...
- 小记:使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面。
SharedPreferences mSharedPreferences = this.getSharedPreferences(NAME, this.MODE_PRIVATE); boolean f ...
- No module ata_piix found的解决方法
在一台as4u6的机器上升级内核到2.6.18时,最好make install的时候报了一个WARNING: No module ata_piix found for 2.6.18, 开始没有在意,重 ...
- sql面向过程用法
sql可以看成是面向过程的编程语言.该语言中,有string.date.table这样的类型等等 一.操作表 sql相当于一个函数,输入是两个或多个表(A, B, ...) 求集合: 并集 union ...