漫反射的原理:漫反射是投射在粗糙表面上的光向各个方向反射的现象,根据入射光线与此点的法线来决定此点的反射强度,用ShaderLab书上的公式表达就是:

Lum = C * max(0,cos<L,N>)

C : 到达此点光线的强度和颜色

N : 法线

L : 单位长度(标准化)的入射光向量。

再顶点函数实现漫反射代码:

Shader "Custom/Diffuse" {Properties{_Color("Color",Color) = (1,1,1,1)   //控制漫反射的颜色}SubShader{Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM
#pragma vertex vert
#pragma fragment frag//引入需要使用灯光的内置变量
#include "Lighting.cginc"fixed4 _Color;struct a2v{float4 vertex :POSITION;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;fixed3 color : COLOR;};v2f vert(a2v v){v2f o;//将顶点由模型空间转换到剪裁空间o.pos = mul(UNITY_MATRIX_MVP,v.vertex);//得到环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//内置函数,将法线从模型空间转换到世界空间,用的是右乘矩阵fixed3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));//将灯光归一化fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//漫反射公式:光照颜色 * 漫反射颜色 * max(0,法向量*光照方向)//saturate():将范围控制在0-1之间fixed3 diffuse = _LightColor0.rgb * _Color.rgb * saturate(dot(worldNormal,worldLight));//添加本行代码为半兰伯特模型//diffuse = diffuse * 0.5 + 0.5;//返回的颜色为环境光加漫反射的光o.color = ambient + diffuse;return o;}fixed4 frag(v2f i) :SV_Target{return fixed4(i.color,1.0);}ENDCG}}Fallback "Diffuse"
}

再片元函数实现漫反射代码:

Shader "Custom/Diffuse2" {Properties{_Color("_Color",Color) = (1,1,1,1)}SubShader{Pass{CGPROGRAM#include "UnityCG.cginc"
#include "Lighting.cginc"  #pragma vertex vert
#pragma fragment frag fixed4 _Color;struct a2v{float4 position:POSITION;float3 normal:NORMAL;};struct v2f{float4 position:SV_POSITION;float3 color:COLOR;};v2f vert(a2v v){v2f f;f.position = mul(UNITY_MATRIX_MVP,v.position);f.color = v.normal;return f;}float4 frag(v2f f) :SV_Target{//得到世界空间下的法线float3 normalDir = normalize(mul(f.color,(float3x3)_World2Object));float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//获得漫反射float3 diffuse = _LightColor0.rgb*max(dot(normalDir,lightDir),0)*_Color;//半兰伯特模型diffuse = diffuse * 0.5 + 0.5;//获取环境光float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;return float4(diffuse + ambient,1);}ENDCG}}Fallback "Diffuse"
}

效果图:

适合用在地形,岩石,墙壁等粗糙的物体上。

Shader实现漫反射相关推荐

  1. Unity shader学习-漫反射-兰伯特光照模型和半兰伯特光照模型

    兰伯特漫反射公式:Diffuse = 直射光颜色 *物体颜色* max(0,cos夹角(光和法线的夹角) ) 下面给出顶点漫反射代码:   Shader "Unlit/005" { ...

  2. Unity Shader知识点(二)写一个基础漫反射Shader

    前言 我们刚学习Shader时,往往会被计算机图形学相关复杂的数学.物理知识所困扰,并在学习过程中丧失兴趣.个人以为,在代码以外,学习Shader应当有本科线性代数课程基础的概念框架,在这一基础上,完 ...

  3. unity基础学习之基础语义

    SubShader 一个Shader有多个SubShader.一个SubShader可理解为一个Shader的一个渲染方案.即SubShader是为了针对不同的渲染情况而编写的.每个Shader至少1 ...

  4. unity基础学习之法线贴图

    原理和概念 法线是一个向量(x,y,z),每一个顶点都有一个法线,用一个纹理去存储的话,那就是(r,g,b),由于法线是垂直于一个面的,对于2d图片来说,那他的z值就是1 用一张纹理来存储法线的值,法 ...

  5. Cocos技术派 | 导入FBX模型实现真3d效果

    文章目录 前言 工程介绍 导入模型 源码 前言 Cocos Creator一直以来都是一个2D游戏引擎,并且致力于H5游戏开发领域.很多同学不满足于开发2D游戏,想尽办法搞一些3D效果,比如自己接入t ...

  6. LearnOpenGL 模型加载—模型(二 绘制模型)

    文章目录 写在前面 和箱子模型告别 坑点 回到主题 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 和箱子模型告别 所以,让我们导入一个由真正的艺 ...

  7. Unity 的基础光照

    目录 前言 内容 BRDF 模型 兰伯特定律 漫发射的计算公式 高光反射的计算公式 Blinn 模型的高光反射计算公式 逐像素与逐顶点光照 Unity 的环境光和自发光 漫反射和高光反射的 Shade ...

  8. 【Unity Shader】三、漫反射Diffuse Shader例子

    学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...

  9. Unity Shader 学习记录(5) —— 实现漫反射光照模型

    1 公式计算 从公式可以看出,要计算漫反射需要知道4 个参数:入射光线的颜色和强度 cgh"材质的漫反射系数mdiuse,表面法线n以及光源方向I. 为了防止点积结果为负值,我们需要使用ma ...

  10. Shader 漫反射

    官方文档 材质属性声明 简单漫反射 Shader "ShaderCaseLearn/CustomsDiffuse"//定义路径 {Properties{_Color (" ...

最新文章

  1. std::map只修改不用加锁
  2. Tomcat+JSP经典配置实例
  3. 《疯狂Java讲义》4
  4. android 驻留广播,Android实现Service永久驻留
  5. 用 php写的条件语句-三种条件语句
  6. VTK:灯光之LightActor
  7. (二)Docker中以redis.conf配置文件启动Redis
  8. 【Jmeter篇】如何利用Jmeter配置元件计数器、随机变量制造批量数据和变量参数化?
  9. Android系统对话框
  10. 学会这20条,做个聪明的人
  11. any、never......TypeScript 中这些特殊的类型,你会用了吗?
  12. CSDN写博客添加代码两种方法
  13. 好用的在线开发辅助工具
  14. 一键删除越狱环境方法教程,uncOvre4.0.2发布了
  15. sftp工具都有哪些_自媒体都有哪些做图神器?自媒体人常用的工具
  16. 设置树莓派屏幕常亮,禁止树莓派屏幕休眠
  17. 计算机算术3-整数加减法(前缀加法器)
  18. 我的世界Java种子算法_Minecraft:说说“种子”的使用和原理吧
  19. Linux软件开发工程师
  20. j2ee期末考试总结

热门文章

  1. 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
  2. 计算机中丢失aclst16,Win10系统运行CAD2006提示计算机中丢失ac1st16.dll怎么办
  3. 跟着陶哲轩学数学 目录
  4. 服务器虚拟化后有几个io地址,CPU虚拟化,内存虚拟化和IO虚拟化
  5. ZooKeeper客户端源码(二)——向服务端发起请求(顺序响应+同步阻塞+异步回调)
  6. 数值分析|二阶三点式Python编程
  7. FPI厂商SoleraNetworks被Blue Coat收购
  8. Java实现 蓝桥杯VIP 算法提高 字符串跳步
  9. WordPiece、BPE详解及代码
  10. JavaScript轻应用网络模块介绍