Shader实现漫反射
漫反射的原理:漫反射是投射在粗糙表面上的光向各个方向反射的现象,根据入射光线与此点的法线来决定此点的反射强度,用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实现漫反射相关推荐
- Unity shader学习-漫反射-兰伯特光照模型和半兰伯特光照模型
兰伯特漫反射公式:Diffuse = 直射光颜色 *物体颜色* max(0,cos夹角(光和法线的夹角) ) 下面给出顶点漫反射代码: Shader "Unlit/005" { ...
- Unity Shader知识点(二)写一个基础漫反射Shader
前言 我们刚学习Shader时,往往会被计算机图形学相关复杂的数学.物理知识所困扰,并在学习过程中丧失兴趣.个人以为,在代码以外,学习Shader应当有本科线性代数课程基础的概念框架,在这一基础上,完 ...
- unity基础学习之基础语义
SubShader 一个Shader有多个SubShader.一个SubShader可理解为一个Shader的一个渲染方案.即SubShader是为了针对不同的渲染情况而编写的.每个Shader至少1 ...
- unity基础学习之法线贴图
原理和概念 法线是一个向量(x,y,z),每一个顶点都有一个法线,用一个纹理去存储的话,那就是(r,g,b),由于法线是垂直于一个面的,对于2d图片来说,那他的z值就是1 用一张纹理来存储法线的值,法 ...
- Cocos技术派 | 导入FBX模型实现真3d效果
文章目录 前言 工程介绍 导入模型 源码 前言 Cocos Creator一直以来都是一个2D游戏引擎,并且致力于H5游戏开发领域.很多同学不满足于开发2D游戏,想尽办法搞一些3D效果,比如自己接入t ...
- LearnOpenGL 模型加载—模型(二 绘制模型)
文章目录 写在前面 和箱子模型告别 坑点 回到主题 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 和箱子模型告别 所以,让我们导入一个由真正的艺 ...
- Unity 的基础光照
目录 前言 内容 BRDF 模型 兰伯特定律 漫发射的计算公式 高光反射的计算公式 Blinn 模型的高光反射计算公式 逐像素与逐顶点光照 Unity 的环境光和自发光 漫反射和高光反射的 Shade ...
- 【Unity Shader】三、漫反射Diffuse Shader例子
学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...
- Unity Shader 学习记录(5) —— 实现漫反射光照模型
1 公式计算 从公式可以看出,要计算漫反射需要知道4 个参数:入射光线的颜色和强度 cgh"材质的漫反射系数mdiuse,表面法线n以及光源方向I. 为了防止点积结果为负值,我们需要使用ma ...
- Shader 漫反射
官方文档 材质属性声明 简单漫反射 Shader "ShaderCaseLearn/CustomsDiffuse"//定义路径 {Properties{_Color (" ...
最新文章
- std::map只修改不用加锁
- Tomcat+JSP经典配置实例
- 《疯狂Java讲义》4
- android 驻留广播,Android实现Service永久驻留
- 用 php写的条件语句-三种条件语句
- VTK:灯光之LightActor
- (二)Docker中以redis.conf配置文件启动Redis
- 【Jmeter篇】如何利用Jmeter配置元件计数器、随机变量制造批量数据和变量参数化?
- Android系统对话框
- 学会这20条,做个聪明的人
- any、never......TypeScript 中这些特殊的类型,你会用了吗?
- CSDN写博客添加代码两种方法
- 好用的在线开发辅助工具
- 一键删除越狱环境方法教程,uncOvre4.0.2发布了
- sftp工具都有哪些_自媒体都有哪些做图神器?自媒体人常用的工具
- 设置树莓派屏幕常亮,禁止树莓派屏幕休眠
- 计算机算术3-整数加减法(前缀加法器)
- 我的世界Java种子算法_Minecraft:说说“种子”的使用和原理吧
- Linux软件开发工程师
- j2ee期末考试总结
热门文章
- 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
- 计算机中丢失aclst16,Win10系统运行CAD2006提示计算机中丢失ac1st16.dll怎么办
- 跟着陶哲轩学数学 目录
- 服务器虚拟化后有几个io地址,CPU虚拟化,内存虚拟化和IO虚拟化
- ZooKeeper客户端源码(二)——向服务端发起请求(顺序响应+同步阻塞+异步回调)
- 数值分析|二阶三点式Python编程
- FPI厂商SoleraNetworks被Blue Coat收购
- Java实现 蓝桥杯VIP 算法提高 字符串跳步
- WordPiece、BPE详解及代码
- JavaScript轻应用网络模块介绍