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模拟的更多相关文章

  1. Unity3D ShaderLab 模拟精灵动画

    Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...

  2. Unity3D ShaderLab 模拟纹理运动

    Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...

  3. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  4. Unity3D ShaderLab 各向异性高光

    Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...

  5. Unity3D ShaderLab法线贴图

    Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...

  6. Unity3D ShaderLab 修改渲染队列进行深度排序

    Unity3D ShaderLab 修改渲染队列进行深度排序 为了更深刻的理解透明度,我们还需要学习一下深度排序,简单来说就是物体被渲染的先后顺序. Unity允许我们通过代码来控制某个特定物体渲染到 ...

  7. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

  8. Unity3D ShaderLab 布料着色器

    Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...

  9. Unity3D ShaderLab 漫反射卷积光照模型

    Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...

随机推荐

  1. 关于 iOS 批量打包的总结

      关于 iOS 批量打包的总结 本文作者: 伯乐在线 - Tsui YuenHong .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 如果你曾经试过做多 target 的项目,到了测试人员要 ...

  2. mongodb的安装及注意事项

    环境:win8 32bit 1:安装 去mongodb的官网http://www.mongodb.org/downloads下载32bit的包 解压后会出现以下文件 在安装的盘C:下建立mongodb ...

  3. 实验一 Java开发环境的熟悉境的熟悉

    - 运行结果: (一)命令行下Java程序开发 (二)Eclipse下Java程序开发.调试 设置断点和单步运行 单步运行:Step Into(快捷捷F5)和Step Over(快捷捷F5) 使程序直 ...

  4. spring mvc设置字符集过滤器

    <filter> <filter-name>springEncoding</filter-name> <filter-class> org.spring ...

  5. jquery返回上一页面

    window.location.href=document.referrer;   返回然后刷新 window.history.back(-1);  返回不刷新

  6. elasticsearch插件之一:kibana

    介绍: 要说kibana,就不得不先说一下logstash.这里呢,先要讲个故事.故事是开头是这样的,Logstash早期曾经自带了一个特别简单的logstash-web用来查看ES中的数据,其功能太 ...

  7. Sticks(poj1011/uva307)

    题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...

  8. 7 libjpeg使用

    一.交叉编译libjepg编译 tar xzf libjpeg-turbo-1.2.1.tar.gz ./configure –help ./configure --prefix=/work/proj ...

  9. js用正则表达式控制价格输入

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  10. bzoj 2301 莫比乌斯反演

    对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 这里题目意思很明显 对于要求的f[n] = sig ...