news 2026/9/2 18:14:27

【光照】UnityURP[光照贴图]GPU instancing在静态动态物体上的应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【光照】UnityURP[光照贴图]GPU instancing在静态动态物体上的应用

静态物体GPU Instancing与光照贴图

‌技术要点‌:

‌静态标记‌:物体需标记为Batching Static,但需禁用静态合批以避免与GPU Instancing冲突。

‌光照贴图绑定‌:通过LightmapIndex和LightmapScaleOffset手动绑定烘焙结果。

‌Shader适配‌:需在着色器中添加实例化支持与光照贴图采样逻辑。

‌示例代码‌:

StaticInstancingExample.cs

using UnityEngine;

[ExecuteAlways]

public class StaticInstancingExample : MonoBehaviour {

public Mesh mesh;

public Material material;

public int instanceCount = 100;

private Matrix4x4[] matrices;

private Vector4[] lightmapOffsets;

void Start() {

// 生成实例变换矩阵

matrices = new Matrix4x4[instanceCount];

lightmapOffsets = new Vector4[instanceCount];

for (int i = 0; i < instanceCount; i++) {

Vector3 pos = Random.insideUnitSphere * 10f;

matrices[i] = Matrix4x4.TRS(pos, Quaternion.identity, Vector3.one);

// 模拟不同光照贴图偏移(需与烘焙数据匹配)

lightmapOffsets[i] = new Vector4(1, 1, i % 2 * 0.5f, i / 2 * 0.5f);

}

}

void Update() {

MaterialPropertyBlock props = new MaterialPropertyBlock();

props.SetVectorArray("_LightmapST", lightmapOffsets); // 传递光照贴图UV偏移

Graphics.DrawMeshInstanced(mesh, 0, material, matrices, instanceCount, props);

}

}

‌实现说明‌:

使用MaterialPropertyBlock传递每实例的光照贴图UV偏移参数。

着色器中需声明UNITY_LIGHTMAP_ON宏并采样unity_Lightmap纹理。

动态物体GPU Instancing与光照探针

‌技术要点‌:

‌光照探针替代‌:动态物体依赖Light Probes获取间接光照。

‌混合光源支持‌:光源设为Mixed模式,静态阴影烘焙到光照贴图,动态物体接收实时阴影。

‌实例化属性扩展‌:通过MaterialPropertyBlock传递探针数据。

‌示例代码‌:

DynamicInstancingExample.cs

using UnityEngine;

public class DynamicInstancingExample : MonoBehaviour {

public Mesh mesh;

public Material material;

public int instanceCount = 100;

private Matrix4x4[] matrices;

void Start() {

matrices = new Matrix4x4[instanceCount];

for (int i = 0; i < instanceCount; i++) {

Vector3 pos = Random.insideUnitSphere * 10f;

matrices[i] = Matrix4x4.TRS(pos, Quaternion.identity, Vector3.one);

}

}

void Update() {

MaterialPropertyBlock props = new MaterialPropertyBlock();

// 为每个实例设置光照探针数据

LightProbes.GetInterpolatedProbe(transform.position, null, out var probe);

props.AddVector("_LightProbeData", new Vector4(probe.occlusion, 0, 0, 0));

Graphics.DrawMeshInstanced(mesh, 0, material, matrices, instanceCount, props);

}

}

‌实现说明‌:

通过LightProbes.GetInterpolatedProbe获取动态物体的光照探针数据。

着色器中需使用SHADERGRAPH_BAKED_LIGHT_PROBES宏处理探针数据。

Shader适配关键代码(URP Shader Graph)

‌静态光照贴图采样‌:在Shader Graph中添加Lightmap节点,并通过Custom Function节点接入实例化的UV偏移参数。

‌动态探针支持‌:添加Baked Light Probes节点,并与实例化属性_LightProbeData关联。

‌优先级注意‌:若同时启用SRP Batcher,需确保材质兼容性(禁用MaterialPropertyBlock)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 4:57:01

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。 在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。 一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组…

作者头像 李华
网站建设 2026/9/2 12:43:46

一次性搞定多任务!Python自动化复用浏览器技巧大揭秘

复用浏览器 简介 在 Web 自动化测试中&#xff0c;浏览器复用是指将已打开的浏览器实例用于多个测试用例。这可以显著提高测试效率和性能&#xff0c;并减少资源消耗。浏览器复用通常与浏览器驱动程序&#xff08;如 Selenium WebDriver&#xff09;一起使用&#xff0c;以便…

作者头像 李华
网站建设 2026/9/2 17:39:55

如何将相册装修成美团风格?看这里!

&#x1f64b;有小伙伴反馈&#xff1a;相册布局能否装修成像美团店铺那样&#xff1f;也就是顶部有一个商家信息卡片&#xff0c;下面就是左右两级分类&#xff0c;这样简洁明了&#xff0c;方便客户快速找款看款 &#x1f44c;包的&#x1f4af;支持的 ⬇️下面将介绍如何将相…

作者头像 李华
网站建设 2026/9/2 4:48:54

EmotiVoice官方认证培训课程上线

EmotiVoice官方认证培训课程上线&#xff1a;高表现力多情感语音合成技术深度解析 在智能语音助手越来越“懂你”的今天&#xff0c;我们是否还满足于那种语气平淡、毫无波澜的机械朗读&#xff1f;当AI开始扮演虚拟偶像、游戏NPC甚至心理陪伴者时&#xff0c;“说什么”已经不…

作者头像 李华
网站建设 2026/9/1 20:42:43

解密prompt系列61. 手搓代码沙箱与FastAPI-MCP实战

最近Vibe Code在各种技术社区刷屏&#xff0c;不过说实话&#xff0c;在日常工作中&#xff0c;我更多是用LLM来生成文档、批量修改代码或者排查问题。毕竟业务需求嘛&#xff0c;很少有能一次性描述清楚的&#xff08;懂的都懂哈哈~&#xff09;。但在看了最新的SWE-Bench Pro…

作者头像 李华
网站建设 2026/9/1 21:10:35

Kubernetes Deployment:部署与管理应用指南

在上一章节中&#xff0c;介绍了pod&#xff0c;以及介绍了如何使用命令行来创建一个pod。那么问题来了&#xff0c;一般来说&#xff0c;我们部署微服务不可能只部署一个噻&#xff0c;肯定是部署多个&#xff0c;但是我们总不可能说&#xff0c;写一个for循环&#xff0c;启动…

作者头像 李华