接着上一篇BasicMyDiffuse的代码来说,这次要说明的就是自定义的光照模型,Ctrl+D>BasicMyDiffuse。

1.>//#pragma surface surf Lambert::这个是默认的光照模型

2.>#pragma surface surf CusDiffuse //自己定义的光照模型CusDiffuse;

3.>在SubShader 中加入光照模型函数:

inline float4 LightingCusDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){

float difLight = max(,dot(s.Normal,lightDir));

float4 col;

//使用(difLight*atten*2)试试区别;;

col.rgb = s.Albedo * _LightColor0.rgb*(difLight*atten*1.5);

col.a=s.Alpha;

return col;

}

第二步,告诉着色器使用CusDiffuse光照模型来计算。第二篇文章使用的是默认的Lambert光照模型。

第三步,编写自己的光照模型函数。函数名格式Lighting+光照模型名称,也就是我们的LightingCusDiffuse;

为了完成漫反射的效果,我们将SurfaceOutput 结构体提供给我们的数据做乘法运算,s.Albedo来自于surf函数,_LightColor0.rgb来自于unity,通过乘法获得col的rgb值。

通过在Unity中的Shader切换,我们可以看出我们自己的光照模型和上一篇BasicMyDiffuse使用Lambert光照模型的效果区别。若把参数调整为2,那么效果区别就很难看出。

read:1 这里用到的点乘函数dot(arg1,arg2)是cg语言内置的数学函数,用来比较两个向量在空间的方向;dot函数会检查两个向量是平行还是垂直,

任意2个向量都可以通过dot函数获得-1~1的夹角范围,-1表示平行向量被离视角的方向,1表示平行但朝向你的方向,0表示和你垂直的方向向量。

read:2 max函数属于cg标准库的函数,我们可以通过他限制点乘的计算结果,max(arg1,arg2);通过max函数保证漫反射计算记过永远介于0和点乘最大值之间。

如果是小于0的数值,着色器可能会生成极度黑色的区域,并且影响后续的计算值。

以下是本次修改后的全部内容。

code start ---------------------------------------------------------------

Shader "91YGame/BasicMyCusDiffuse" {
Properties {
_EmissiveColor("Emissive Color",Color) = (,,,)
_AmbientColor("Ambient Color",Color)=(,,,)
_MySliderValue("Slider Value",Range(,))=1.3
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
//#pragma surface surf Lambert
#pragma surface surf CusDiffuse float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue; 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 LightingCusDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten){
float difLight = max(,dot(s.Normal,lightDir));
float4 col;
col.rgb = s.Albedo * _LightColor0.rgb*(difLight*atten*1.5);
col.a=s.Alpha;
return col;
}
ENDCG
}
FallBack "Diffuse"
}

code end ---------------------------------------------------------------

Unity3D ShaderLab 自定义光照模型的更多相关文章

  1. Unity3D ShaderLab Half Lambert光照模型

    Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ...

  2. Unity3D ShaderLab 静态贴图光照模型

    Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...

  3. Unity3D ShaderLab 创建自定义高光类型

    Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数 ...

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

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

  5. Unity3D ShaderLab 各向异性高光

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

  6. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  7. Unity3D ShaderLab 使用BlinnPhong高光类型

    Unity3D shaderLab 使用BlinnPhong高光类型 上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所 ...

  8. Unity3D ShaderLab 立方体图的菲涅尔反射

    Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...

  9. Unity3D ShaderLab 基础的高光实现

    Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现 ...

随机推荐

  1. iOS应用架构现状分析

    iOS从2007年诞生至今已有近10年的历史,10年的时间对iOS技术圈来说足够产生相当可观的沉淀,尤其这几年的技术分享氛围无论国内国外都显得异常活跃.本文就iOS架构这一主题,结合开发圈里讨论较多的 ...

  2. css背景定位

    日期:2015-12-05 背景定位算是才弄明白: background-position:50% 50%; 图片水平和垂直居中.与 background-position:center center ...

  3. linux shell 单引号 双引号 反引号的区别

    一.单引号和双引号 首先, 单引号和双引号,都是为了解决中间有空格的问题. 因为空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行就会报错.为 ...

  4. 编程思考 PetShop读后感

    标准,插拔式的设计思想建立一致的标准是通向“复用”的通道.分层,使其得到的充分的独立.一个东西如果独立了[不是孤立],这个事物就具有很强大的力量,这个和一个人的成长是相同的道理.所以呢,在写程序的过程 ...

  5. Linux系统中的日常监控知识点

    1.命令熟悉之w [xiongchao@oc3006745124 Desktop]$ w :: up :, users, load average: 1.48, 1.19, 1.11 USER TTY ...

  6. shell之两个文档找出相同的之后在选

    for i in `cat t1` ; do echo "$i" | awk '{sub(/^ */,"");sub(/ *$/,"")}1 ...

  7. 在ASP.NET MVC中使用CKEditor和CkFinder

    在你需要使用editor控件的页面头部添加: <head> ... <script type="text/javascript" src="/ckedi ...

  8. java jar

    http://www.cnblogs.com/shirui/p/5270969.html Java之 将程序打包成jar包   准备材料: 1.java文件: Helloworld.java pack ...

  9. [开发笔记]-多线程异步操作如何访问HttpContext?

    如何获取文件绝对路径? 在定时器回调或者Cache的移除通知中,有时确实需要访问文件,然而对于开发人员来说, 他们并不知道网站会被部署在哪个目录下,因此不可能写出绝对路径, 他们只知道相对于网站根目录 ...

  10. C++-类的const成员变量

    当类中用到一些固定值时,希望将其定义为const成员变量,防止被修改. 但因为const成员变量因为初始化之后就不能修改,因此只能在构造函数的初始化列表中初始化 如果是数组,则没有办法在初始化列表中初 ...