Unity中Batching优化的GPU实例化(4)

文章目录

  • 前言
  • 一、构建需要实例化的额外数据
  • 二、在顶点着色器,将实例化 ID 从 appdata 存入 v2f 传给片元着色器
  • 三、在片断着色器中访问具体的实例化变量
  • 三、使用代码修改Shader材质属性,实现GPU实例化后不同对象颜色不同的效果
    • 1、在C#测试脚本生成小板凳的时候修改材质属性
    • 2、我们需要使用材质属性块来修改才可以不让GPU实例化失效


前言

在之前的文章中,我们解决了GPU实例化需要的 appdata 、v2f 数据准备 和 使GPU实例化后的顶点位置正确。

  • Unity中Batching优化的GPU实例化(2)

  • Unity中Batching优化的GPU实例化(3)

在这篇文章中,我们来实现一下GPU实例化后怎么使不同对象使用不同的材质颜色,这里只是用颜色作为例子,如果需要 GPU实例化后,不同对象使用不同属性,也是用此方法。


一、构建需要实例化的额外数据

因为我们需要修改材质的颜色,所以需要定义一个颜色属性。
但是,在使用GPU实例化定义属性时,得按如下方法定义

构建需要实例化的额外数据:
#ifdef UNITY_INSTANCING_ENABLED
UNITY_INSTANCING_BUFFER_START(prop自定义名字)
UNITY_DEFINE_INSTANCED_PROP(type, name)
UNITY_INSTANCING_BUFFER_END(prop自定义名字)
#endif

  • 在UnityInstancing.cginc文件中,看一下Unity这句话做了什么

UNITY_INSTANCING_BUFFER_START(prop)

UNITY_INSTANCING_BUFFER_END(prop)

其实这两句话主要是,定义了一个结构体。

在这里插入图片描述

  • UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color) 这句话定义结构体中的变量

  • 在我的Shader中,使用材质的颜色属性作为测试:

UNITY_INSTANCING_BUFFER_START(prop)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
UNITY_INSTANCING_BUFFER_END(prop)


二、在顶点着色器,将实例化 ID 从 appdata 存入 v2f 传给片元着色器

UNITY_TRANSFER_INSTANCE_ID(v, o); 当需要将实例化ID传到片断着色器时,在顶点着色器中添加.

  • 在UnityInstancing.cginc文件中,看一下Unity这句话做了什么

由源码可知,这句话做了类似于 o,uv = i.uv; 这样的操作

在这里插入图片描述


三、在片断着色器中访问具体的实例化变量

UNITY_ACCESS_INSTANCED_PROP(arrayName, propName)

  • 在UnityInstancing.cginc文件中,看一下Unity这句话做了什么

在这里插入图片描述

  • 我把我测试使用的_Color替换成UNITY_ACCESS_INSTANCED_PROP(prop, _Color)

fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
return i.worldPos.y * 0.15 + UNITY_ACCESS_INSTANCED_PROP(prop, _Color);
}


三、使用代码修改Shader材质属性,实现GPU实例化后不同对象颜色不同的效果

做完以上步骤后,我们的Shader就支持GPU实例化后的不同对象使用不同的颜色属性了。但是,我们要用代码修改才有用,不是直接调节属性面板

我们可以看出,调节属性面板我们的所有 GPU实例化问题,属性颜色都会随之改变
请添加图片描述

1、在C#测试脚本生成小板凳的时候修改材质属性

  • 我们在生成小板凳时。同时修改小板凳材质属性的颜色(不能这样修改,会导致GPU实例化失效):
using UnityEngine;public class P2_6_5 : MonoBehaviour
{public GameObject Prefab;public int Count = 1;public int Range = 10;// Start is called before the first frame updatevoid Start(){for (int i = 0;i < Count;i++){Vector3 pos = Random.insideUnitCircle * Range;Color color = new Color(Random.value,Random.value,Random.value,Random.value);GameObject chair = Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);chair.GetComponentInChildren<MeshRenderer>().material.SetColor("_Color", color);}}
}

我们可以看见,虽然颜色变了。但是,GPU实例化失效了

在这里插入图片描述

2、我们需要使用材质属性块来修改才可以不让GPU实例化失效

MaterialPropertyBlock prop = new MaterialPropertyBlock();
prop.SetColor(“_Color”,color);

using UnityEngine;public class P2_6_5 : MonoBehaviour
{public GameObject Prefab;public int Count = 1;public int Range = 10;// Start is called before the first frame updatevoid Start(){for (int i = 0;i < Count;i++){Vector3 pos = Random.insideUnitCircle * Range;Color color = new Color(Random.value,Random.value,Random.value,Random.value);GameObject chair = Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);MaterialPropertyBlock prop = new MaterialPropertyBlock();prop.SetColor("_Color",color);chair.GetComponentInChildren<MeshRenderer>().SetPropertyBlock(prop);}}
}

最终效果(CPU实例化成功,且不同对象有不同的颜色属性了):

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactJs笔记摘录

前言 以前2018年搞过一段时间react antd开发&#xff0c;兜兜转转又回到react世界。 TODO中 Hook函数 JSX语法 根元素与斜杠 注意局部的jsx片段也要加根元素: return (<div>{items.map((item) > (// 此处只能有一个根元素!!!<>...<div className&quo…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 23 章:命名实体识别提示

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 23 章&#xff1a;命名实体识别提示 命名实体识别&#xff08;NER&#xff09;是一种允许模型对文本中的命名实体&#xff08;如人物、组织、地点和日期&#xff09;进行识别和分类的技术。 要在 ChatGPT…

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现…

Leetcode—290.单词规律【简单】

2023每日刷题&#xff08;五十一&#xff09; Leetcode—290.单词规律 实现代码 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

React中使用TypeScript代替prop-types

原文链接 公众号-React中使用TypeScript代替prop-types 个人公众号&#xff0c;呜呜呜&#xff0c;求各位大佬们关注下&#xff0c;本人的公众号主要写React 跟NodeJs的 ​关于prop-types 对于部分的同学&#xff0c;不大了解为什么我们的代码里面要用到prop-types这个库&a…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以…

深度学习基础回顾

深度学习基础 浅层网络 VS 深层网络深度学习常用的激活函数Sigmoid 函数ReLU 函数Softplus 函数tanh函数 归纳偏置CNN适用数据归纳偏置 RNN适用数据归纳偏置 浅层网络 VS 深层网络 浅层神经网络参数过多&#xff0c;导致模型的复杂度和计算量很高&#xff0c;难以训练。而深层…

Redisson的基础使用(2)

布隆过滤器&#xff08;Bloom Filter&#xff09; 布隆过滤器一般用于解决缓存穿透的问题。主要原理是使用一组哈希函数&#xff0c;将元素映射成一组位数组中的索引位置。如果要检查某个元素是否在集合中时&#xff0c;将此元素通过所有的哈希函数&#xff0c;查看哈希值对应的…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

多态和继承复习

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 多态多态成立的条件细节 继承&#x1f48e;总结 多态 多态成立的条件 存在继承关系或者实现关系子类重写父类的方法父类引用指向子类对象 细节 通过父类的引用调用子类的对象 Animal animal new Dog();animal…

C语言搭建项目-学生管理系统(非链表)

、 目录 搭建offer.h文件 搭建offer.c中的main函数 密码登入系统 搭建my_oferr.c中的接口函数 使用帮助菜单接口函数 增加学生信息接口函数 查询学生信息接口函数 删除学生信息接口函数 保存学生信息接口 打开文件fopen 关闭文件fclose 判断是否保存文件fwrite 退出执行文件…

C++:const类型数据的修改问题

在C语言中const类型的数据严格意义上可以修改&#xff1a; const int a1; int*b&a; *b2;不同于C语言&#xff0c;C中指针类型是要严格对应的&#xff0c;对const类型的数据必须使用const类型的指针进行接收&#xff0c;从而避免修改&#xff1b; 但问题是c中同样支持指针的…

年度工作总结怎么写?掌握这些年终总结万能公式,让你的报告出彩无比!

光阴似箭&#xff0c;日月如梭&#xff0c;时间总是不疾不徐地向前奔去&#xff0c;转眼就来到了2023年的最后一个月&#xff0c;12月一到&#xff0c;上班族和打工人又要开始忙活工作总结的事情~ 工作总结&#xff0c;不仅是一年工作的回顾&#xff0c;更是未来规划的起点。你…

Springboot中的RestTemplate

Springboot中的RestTemplate 在Spring Boot应用程序中&#xff0c;RestTemplate是一个用于进行HTTP请求的强大工具。通常用于与RESTful API进行交互、调用其他服务或执行HTTP请求。它提供了各种方法来发送HTTP请求&#xff08;如GET、POST、PUT、DELETE等&#xff09;&#xf…

cuda lib 线程安全的要义

1, 概述 cuda lib 线程安全的几个多线程的情景&#xff1a; 单卡多线程&#xff1b; 多卡多线程-每卡单线程&#xff1b; 多卡多线程-每卡多线程&#xff1b; 需要考虑的问题&#xff1a; 每个 cublasHandle_t 只能有一个stream么&#xff1f; 每个cusolverHandle_t 只能有一…

python3.5安装教程及环境配置,python3.7.2安装与配置

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python3.5安装教程及环境配置&#xff0c;python3.7.2安装与配置&#xff0c;现在让我们一起来看看吧&#xff01; python 从爬虫开始&#xff08;一&#xff09; Python 简介 首先简介一下Python和爬虫的关系与概念&am…

Android Studio的代码笔记--IntentService学习

IntentService学习 IntentService常规用法清单注册服务服务内容开启服务 IntentService 一个 HandlerThread工作线程&#xff0c;通过Handler实现把消息加入消息队列中等待执行&#xff0c;通过传递的intent在onHandleIntent中处理任务。&#xff08;多次调用会按顺序执行事件…

Spring Cloud Alibaba实践 --Sentinel

sentinel简介 Sentinel的官方标题是&#xff1a;分布式系统的流量防卫兵。从名字上来看&#xff0c;很容易就能猜到它是用来作服务稳定性保障的。对于服务稳定性保障组件&#xff0c;如果熟悉Spring Cloud的用户&#xff0c;第一反应应该就是Hystrix。但是比较可惜的是Netflix…

三防平板|手持终端PDA|8寸/10寸工业三防平板电脑主板方案定制

近年来&#xff0c;随着科技的快速发展&#xff0c;三防平板成为了各行各业中不可或缺的工具。三防平板采用IP67级别的防护设计&#xff0c;通过了多项测试标准&#xff0c;如国标和美标&#xff0c;具备防水、防摔、防尘、防撞、防震、防跌落以及防盐雾等多重防护功能。因此&a…