UnityShader实例07:在shader调用unity内置lightmap和light Probes

2023-11-08

在shader调用unity内置lightmap和Light Probes


在编写unity shader的时候,有时候会有需求,希望写的shader能支持unity内置lightmap或者light probe (灯光探测器)。如果是用surface 编写的话,这些自然不用考虑,unity会自动编译支持,但如果是用vert&frag编写shader,这些需要自己添加相关代码调用了 。


unity内置lightmap的调用


为了使unity内置数据和各种宏定义(如本文的LIGHTMAP_OFF)起作用,需要添加#pragma指令:

#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON


在unity5.0之前的版本需要声明一下两个内置参数,unity5.0的话就不需要这两句了:

half4 unity_LightmapST;
sampler2D unity_Lightmap;

Lightmap是使用模型的uv2 ,因此接下来在顶点输入结构体里声明uv2:


float2 texcoord1 : TEXCOORD1;

在另一个顶点结构里面定义用来接收uv2的uv值:

#ifndef LIGHTMAP_OFF
half2 uvLM : TEXCOORD4;
#endif

在vert函数里面给uvLM赋值:

#ifndef LIGHTMAP_OFF
o.uvLM = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#endif

然后frag函数里对lightmap贴图采样并叠加给主颜色:

#ifndef LIGHTMAP_OFF
fixed3 lm = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uvLM.xy));
col.rgb*=lm;
#endif
在上面的代码中使用了DecodeLightmap解码unity的内置光照贴图,这是因为 Unity烘焙的LightMap是32bit的HDR图,在桌面端,光照贴图的编码为RGBM,而在移动端,大部分情况下,光照贴图的编码为double-LDR,因此需要针对不同平台提供不同的编码方式。DecodeLightmap作用就在这里,它可以针对不同的平台对光照贴图进行解码


VF版本代码01:

Shader "PengLu/Unlit/TextureLM" {
Properties {
	_MainTex ("Base (RGB)", 2D) = "white" {}
}

SubShader {
	Tags { "RenderType"="Opaque" }
	LOD 100
	
	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
				float2 texcoord1 : TEXCOORD1;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				#ifndef LIGHTMAP_OFF
				half2 uvLM : TEXCOORD1;
				#endif 
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				#ifndef LIGHTMAP_OFF
				o.uvLM = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
				#endif
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, col);
				UNITY_OPAQUE_ALPHA(col.a);
				#ifndef LIGHTMAP_OFF
				fixed3 lm = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uvLM.xy));
				col.rgb*=lm;
				#endif
				return col;
			}
		ENDCG
	}
}

}

VF版本代码01效果:



unity内置Light Probes的调用


在shader中我们是通过unity定义的half3 ShadeSH9(half4 normal)来调用Light Probes的,Light Probes照明使用的是一种叫球谐光照(Sphere Harmonic)的模拟,简称SH,因此在ShadeSH9函数需要一个世界坐标中的Normal来决定物体表面的光照。

首先我们在顶点输出结构定义一个参数SHLighting:

fixed3  SHLighting : COLOR;

然后在顶点函数里为它赋值:

 

float3 worldNormal = mul((float3x3)_Object2World, v.normal);//获得世界坐标中的normal

o.SHLighting= ShadeSH9(float4(worldNormal,1)) ;

VF版本代码02:

Shader "PengLu/Unlit/TextureLM" {
Properties {
	_MainTex ("Base (RGB)", 2D) = "white" {}
	_SHLightingScale("LightProbe influence scale",float) = 1
}

SubShader {
	Tags { "Queue"="Geometry""LightMode"="ForwardBase""RenderType"="Opaque"   }
	LOD 100
	
	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

		

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				fixed3  SHLighting : COLOR;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _SHLightingScale;
			
			v2f vert (appdata_base v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				float3 worldNormal = mul((float3x3)_Object2World, v.normal);
				o.SHLighting= ShadeSH9(float4(worldNormal,1)) ;
								UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				col.rgb*=i.SHLighting;
				UNITY_APPLY_FOG(i.fogCoord, col);
				UNITY_OPAQUE_ALPHA(col.a);
				
				return col*_SHLightingScale;
			}
		ENDCG
	}
}

}

VF版本代码02效果




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnityShader实例07:在shader调用unity内置lightmap和light Probes 的相关文章

  • 如何使用 WebGL 和 GLSL 在 J/s 文件中运行 Shadertoy 中的着色器?

    我是着色器编程新手 我想使用 WebGL 和 GLSL 创建一个着色器 为了了解它的实际工作原理 我想测试 Shadertoy 的着色器 但是如何从 Shadertoy 获取代码并实际在 J S 文件中运行它呢 您是否只需将 Shadert
  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • OpenGL 二进制程序格式是否标准化?

    我一直在谷歌上搜索 OpenGL 二进制格式及其实际含义 到目前为止我还没有取得太大的成功 我知道我可以按如下方式获取数量和格式集 glGetIntegerv GL PROGRAM BINARY FORMATS values 0 其中 va
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • Unity3D Sprite ...但是单面的?

    团结优秀Sprites Unity优秀的新精灵 http docs unity3d com ScriptReference Sprite html 除其他有价值的优点外 实际上是双面的 在 2D 或 3D 用例中 您可以翻转这些小混蛋 但仍
  • 使用 LibGDX 的法线贴图 GLSL

    我尝试使用 LibGDX 实现法线贴图 因此 当我在顶点着色器中计算漫反射和镜面反射颜色时 我得到了一些积极的结果 至少我这么认为 顶点着色器 attribute vec4 a position attribute vec2 a texCo
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • 为什么我不能使用uniform1f而不是uniform4f来设置vec4制服?

    我通过以下方式逐步学习WebGL这本书 https sites google com site webglbook 我尝试通过使用缓冲区来绘制三个点 gl ARRAY BUFFER 而不是循环 正如我之前在本书的其他示例中所做的那样 var
  • GLSL 纹理立方体和纹理2D 在同一着色器中

    我似乎无法两者兼得texture2D and textureCube 在一个着色器中 当我这样做时 什么也没有显示 也没有错误 我用我自己的着色器加载器和 Apple GLSL 着色器生成器尝试了这一点 并且发生了同样的事情 即使我有也会发
  • 如何将shadershop公式转换成glsl

    我最近一直在学习着色器的一些基础知识 并且想出了一个很棒的视觉工具 着色器商店 http www cdglabs org Shadershop 但我无法将我在此站点中创建的公式转换为 glsl 一个简单的例子 我在此网站中创建了一个公式 我
  • OpenGL 统一缓冲区 std140 布局

    我正在尝试通过 GeForce 8600 GT 上的统一块将整数数组传递给片段着色器 一切均根据 GLSL version 330 在应用程序方面我有 int MyArray 7102 filling binding etc glBuffe
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • DirectX 世界视图矩阵乘法 - GPU 或 CPU 的地方

    我是 directx 的新手 但令我惊讶的是 我看到的大多数示例中 世界矩阵和视图矩阵都是作为顶点着色器的一部分相乘 而不是与 CPU 相乘并将结果传递给着色器 对于刚性对象 这意味着您为对象的每个顶点将相同的两个矩阵相乘一次 我知道 GP
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 在 C++ GPGPU 库中嵌入 cg 着色器

    我正在编写一个 GPGPU 流体模拟 它使用 C OpenGL Cg 运行 目前 该库要求用户指定着色器的路径 然后从中读取它 我发现必须在我自己的项目和测试中指定这一点非常烦人 因此我希望将着色器内容与其余内容链接起来 理想情况下 我的
  • 帧缓冲区和在 opengl 中使用着色器

    我对帧缓冲区有点困惑 我想要做的是使用附加了多个纹理的帧缓冲区 填充每个纹理 然后使用着色器组合 混合 所有纹理以创建新的输出 听起来很容易 是的 我也是这么想的 但我不明白 如何将当前绑定的纹理传递给着色器 您需要的是将纹理放入特定的槽中
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点

随机推荐

  • pinia-plugin-persist 解决刷新后,store数据重置

    Pinia 是 Vue 的专属状态管理库 它允许你跨组件或页面共享状态 在某些特定的单页面应用场景下 我们使用常规的 store 来存储数据 很多时候面临着刷新就会被重置 所以 我们急需 pinia plugin persist 来实现对某
  • 强制性养老机构安全规范2022年实行

    国家标准委发布 养老机构服务安全基本规范 强制性国家标准主要分为基本要求和安全风险评估两个主要方面实行 基本要求 养老机构服务安全基本规范 的基本要求是养老机构应符合消防 卫生 环境 食品安全 建筑要求等强制性的保障要求 针对养老院内部的工
  • 免费分享最新整理《黑马测试面试宝典V2_0》

    免费分享最新整理 黑马测试面试宝典V2 0 软件测试面试题在网上流传也已不少 但是经过仔细查看发现了两个很重要的问题 第一 网上流传的面试题的答案并不能保证百分百正确 也就是说各位朋友辛辛苦苦花了很多时间准备的面试题 很可能最后的答案却错误
  • 基于SVM的RFE

    特征选择方法 RFE 包装式模型 一 RFE基本思想 1 将全部特征纳入模型中 得到特征对应的系数 即权重 2 将取值最小的系数平方和对应的特征从模型中移除 3 用剩下的特征在进行模型训练 在进行特征移除 直至没有特征 二 基于SVM的RF
  • 利用kali hydra 暴力破解Windows7(hydra的基本用法)会继续更新

    Hydra的简单介绍 Hydra对应的英文意思是九头蛇 它是一款爆破神器 可以对多种服务的账号和密码进行爆破 包括Web登录 数据库 SSH FTP等服务 支持Linux Windows Mac平台安装 其中Kali Linux中自带Hyd
  • Pandas数据结构 参数说明+实例解析!!

    Pandas Series 一维 类似于一维数组与字典的结合 可以保存任何数据类型 有索引 函数如下 pandas Series data index dtype name copy 参数说明 data 一组数据 可接受多种输入 ndarr
  • NoteExpress从中国知网导入题录的经验

    NoteExpress文献管理软件从中国期刊网导入题录 期刊论文 硕士论文 其他论文的方法都不同 如下 1 导入题录 期刊论文 1 进入地址 http epub cnki net grid2008 index ZKCALD htm 2 输入
  • leaftlet 加载热力图 且改变热力图大小不随着地图层级改变而改变

    加载leaftlet 热力图只需要下载 heatmap js leaflet heatmap js 下载地址 下载只需要引入相关JS就可以了 https github com pa7 heatmap js tree develop plug
  • 你知道如何进行兼容性测试吗?

    你知道如何进行兼容性测试吗 兼容性测试是确保应用程序在各种设备和平台上正常运行的关键步骤 下面是一些进行兼容性测试的建议 确定测试范围 在进行兼容性测试之前 开发人员需要确定测试范围 他们需要考虑测试对象的类型 包括硬件 软件 操作系统 浏
  • CCF CSP——202203-2 出行计划

    问题描述 试题链接 出行计划 满分题解 此题为一般简单模拟题 题目读完 这不就是遍历一遍所有场所 根据场所需要的c个小时核酸 那么判断计划的t 是否属于 t k t k c 的范围 是则answer加一 最后输出answer 三下五除二写完
  • java jar一键安装打包成exe可执行安装文件

    java jar一键安装打包成exe可执行安装文件 Java jar如何打包成exe可安装可运行文件 1 导出java jar 2 编译成exe的可执行文件 即免安装可执行文件包 3打包成exe安装指导已经部署文件 更多的快捷方式希望大家在
  • mybatis传入参数的一个坑

  • 【vs code】C/C++编译调试环境配置

    VS code C C 编译调试环境搭建 由于vscode只是文本编辑器本身没有编译环境 但是可以调用外部的编译环境运行调试代码 Windows下C C 编译环境 1 WSL WSL是Windows下Linux子系统 可以在Windows下
  • [激光原理与应用-61]:激光器 - 种子源 - 1064nm皮秒种子源参数解读

    目录 第1章 种子源介绍 1 1 简介 1 2 种子源特点 1 3 皮秒种子源应用 第2章 瀚盈激光 种子源性能指标解读 2 1 波长 1064nm 红外 2 2 光谱宽度 频率宽度 带宽 2 3 线宽 2 4 脉冲宽度 2 5 重复频率
  • 论文阅读:Attention Is All You Need【注意力机制】

    论文阅读 Attention Is All You Need 原文链接 Attention Is All You Need 作者 Ashish Vaswani Noam Shazeer Niki Parmar Jakob Uszkoreit
  • Python基础数据之列表

    Python基础数据之列表 一 列表介绍 1 简介 2 列表的特性 二 列表初识 三 for循环中使用 四 列表长度表示 五 向列表中添加内容 1 向列表中追加内容 2 向列表中插入内容 3 批量添加内容 六 删除列表中内容 1 删除列表中
  • Kafka命令及相关参数解释

    Kafka命令及相关参数解释 由于kafka是去中心化的架构 所以需要在每台节点上启动kafka 且依赖于zookeeper 需要先启动zookeeper 启动kafka kafka server start sh daemon opt m
  • M4: mysql日记之建表、修改表结构及约束(alter的使用)

    1 创建表 1 创建表 create database if not exists test01 id int n auto increment not null name varchar 6 not null primary key id
  • WPF 解决数据量大造成页面卡顿

    最近做一个项目 使用datagrid动态绑定并扩展行列 数据量大概两万条 加载后发现页面近乎卡死状态 查找资料发现是wpf页面渲染问题 以下是解决方案 datagrid控件添加属性VirtualizingPanel Virtualizati
  • UnityShader实例07:在shader调用unity内置lightmap和light Probes

    在shader调用unity内置lightmap和Light Probes 在编写unity shader的时候 有时候会有需求 希望写的shader能支持unity内置lightmap或者light probe 灯光探测器 如果是用sur