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. hdu5876 Sparse Graph(补图最短路 bfs)

    题目链接:hdu5876 Sparse Graph 详见代码.. #include<cstdio> #include<cstring> #include<algorith ...

  2. go——搭建Win7下的Go开发环境

    1.首先需要下载下载go平台安装包 安装程序 下载地址:https://golang.org/dl/ (墙内下载地址http://www.golangtc.com/download),如果是您的系统是 ...

  3. PHP 页面编码声明方法详解(header或meta)

    php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...

  4. js私有共有成员

      在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScr ...

  5. redhat enterprixe 5.0 DNS 服务配置与管理

    一.了解DNS相关概念 DNS是一个分布式数据库,在本地负责控制整个分布式数据库的部分段,每一段中的数据通过客户机/服务器模式在整个网络上存取.通过采用复制技术和缓存技术使得整个数据库稳定可靠的同时, ...

  6. mysql启动报错

    查看报错日志: 131023 15:02:59 [ERROR] Can't start server: Bind on TCP/IP port: No such file or directory13 ...

  7. API 进程、线程函数

    CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指 ...

  8. 通过CoreImage生成二维码

    从IOS7开始集成了二维码的生成和读取功能 生成二维码的步骤: 1.导入CoreImage框架 2.通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码只能放数字): 纯文本 名片 URL ...

  9. 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤

    在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 服务供应商A和B希望在 ...

  10. RHEL 6.3安装(超级详细图解教程)[转载]

        附:RHEL6.3下载地址 32位:http://rhel.ieesee.net/uingei/rhel-server-6.3-i386-dvd.iso 64位:http://rhel.iee ...