当前位置: 首页 > news >正文

baked light+bake indirect+sampling lightmap

如图所示:
在这里插入图片描述

这个是使用unity默认的材质:
在这里插入图片描述

进行烘焙的结果。

下面我们要通过自己写shader,来完成光照贴图的采样。

Shader "MyShader/SampleLightmap"
{
	SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile _ LIGHTMAP_ON
			#include"Lighting.cginc"

			struct VertexData
			{
				float4 pos:POSITION;
				float2 uv:TEXCOORD0;
				float2 uv1:TEXCOORD1;
			}; 
	 
			struct V2F
			{
				float4 pos:SV_POSITION;
				float2 uv:TEXCOORD0;
				#if defined(LIGHTMAP_ON)
					float2 uv1:TEXCOORD1;
				#endif
			};


			V2F vert(VertexData v)
			{
				V2F res;
				res.pos = UnityObjectToClipPos(v.pos);
				res.uv = v.uv;
				#if defined(LIGHTMAP_ON)
				res.uv1 = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;
				#endif
				return res;
			}
			 
			fixed4 frag(V2F i):SV_TARGET
			{
				fixed4 col = fixed4(1,0,0,1);
				#if defined(LIGHTMAP_ON)
					col.rgb = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv1));
				#endif
				return col;
			}
			ENDCG
		}
	}
}

ok,这里几个注意点:
1、包含头文件:#include"Lighting.cginc", 因为DecodeLightmap函数在其中声明的
2、编译变体:#pragma multi_compile _ LIGHTMAP_ON
3、光照贴图uv的转换:res.uv1 = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;
4、解码光照贴图数据:DecodeLightmap

把场景中物体使用的材质换成我们的材质球:
在这里插入图片描述

在这里插入图片描述

左图为我们自己的材质球,右图是unity默认的材质球,效果还是近似的,说明采样正确。

本文着重阐述了,如何在全是baked模式下灯光烘焙,然后使用烘焙indirect的方式进行烘焙,最后完成采样的过程。

注意点:
在这里插入图片描述
我们的主灯就一个平行光,其模式为baked,也就是静态的。

如果我们采用的是shadowmask进行烘焙,其实效果不变,也就是说shadowmask对baked的灯光是没有作用的,同样他对realtime的灯也是没有作用的,只对mixed模式的灯才有作用。
在这里插入图片描述

另外有人可能不太明白什么是有这个关键字:LIGHTMAP_ON
其实是当烘焙之后有烘焙贴图了,那么此时这个关键字就被激活了。如果你clear掉:
在这里插入图片描述

那么此时关键字就关闭了。

记得哦,如果你把光照贴图删除了,此时是变成黑色,而不是说关键字就关闭了,此时关键字还是打开的,只是光照数据为0而已。

关于此文章的说明:
1、首先上面的物件都是使用的我们自己的材质,在没有烘焙之前全部是fixed4 col = fixed4(1,0,0,1);红色。一旦烘焙之后,采用的是光照贴图。

2、其次是文章中并没有将自发光和环境光添加到烘焙贴图中去,这个后面的章节会讲到。

相关文章:

  • linux基础随记
  • 随手练——十六进制转八进制 (不限制长度)
  • 认识DiffuseAndSpecularFromMetallic和UNITY_BRDF_PBS
  • 如何将自发光和漫反射添加到烘焙贴图中
  • Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形
  • Shadowmask和Distance Shadowmask的区别
  • Angular7_获取异步方法里面的数据
  • maven tomcat jstl 异常
  • maven下载及配置(win7 64位系统)
  • 寒假一:打印沙漏
  • unity depth texture-01
  • LinearEyeDepth和Linear01Depth
  • 打印沙漏
  • SQLAlchemy增删改查 一对多 多对多
  • 体积光,体积雾——链接
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2019年如何成为全栈工程师?
  • Android交互
  • C语言笔记(第一章:C语言编程)
  • fetch 从初识到应用
  • JavaScript的使用你知道几种?(上)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • MobX
  • node 版本过低
  • node和express搭建代理服务器(源码)
  • vue脚手架vue-cli
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从伪并行的 Python 多线程说起
  • 诡异!React stopPropagation失灵
  • 深入浅出Node.js
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我的zsh配置, 2019最新方案
  • 用element的upload组件实现多图片上传和压缩
  • 用jQuery怎么做到前后端分离
  • #LLM入门|Prompt#3.3_存储_Memory
  • (+4)2.2UML建模图
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (26)4.7 字符函数和字符串函数
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (搬运以学习)flask 上下文的实现
  • (分布式缓存)Redis持久化
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (利用IDEA+Maven)定制属于自己的jar包
  • (生成器)yield与(迭代器)generator
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)我也是一只IT小小鸟
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net IOC框架入门之一 Unity
  • .NET Remoting学习笔记(三)信道
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET轻量级ORM组件Dapper葵花宝典