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

这篇具有很好参考价值的文章主要介绍了Unity中Batching优化的GPU实例化(4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在之前的文章中,我们解决了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中Batching优化的GPU实例化(4),Unity,unity,游戏引擎

  • 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中Batching优化的GPU实例化(4),Unity,unity,游戏引擎


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

UNITY_ACCESS_INSTANCED_PROP(arrayName, propName)

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

Unity中Batching优化的GPU实例化(4),Unity,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实例化问题,属性颜色都会随之改变
Unity中Batching优化的GPU实例化(4),Unity,unity,游戏引擎

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 update
    void 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实例化失效了

Unity中Batching优化的GPU实例化(4),Unity,unity,游戏引擎

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 update
    void 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实例化成功,且不同对象有不同的颜色属性了):

Unity中Batching优化的GPU实例化(4),Unity,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-753168.html

到了这里,关于Unity中Batching优化的GPU实例化(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity 性能优化之GPU和资源优化

    众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那

    2024年02月02日
    浏览(47)
  • Unity性能优化与分析--GPU

    每一帧,Unity 都需要确定必须渲染哪些对象,然后创建绘制调用。绘制调用是调用图形 API 来绘制对象(如三角形),而批处理是要一起执行的一组绘制调用。 随着项目变得更加复杂,您需要用管线来优化 GPU 的工作负载。 通用渲染管线 (URP) 目前使用单通道前向渲染器将高质

    2024年03月15日
    浏览(41)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • Unity3D学习笔记8——GPU实例化(3)

    在前两篇文章《Unity3D学习笔记6——GPU实例化(1)》《Unity3D学习笔记6——GPU实例化(2)》分别介绍了通过简单的顶点着色器+片元着色器,以及通过表面着色器实现GPU实例化的过程。而在Unity的官方文档Creating shaders that support GPU instancing里,也提供了一个GPU实例化的案例,这里就详

    2023年04月22日
    浏览(34)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(52)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(47)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(74)
  • Unity GPU Skinning Tool: 提升3D游戏动画性能的新利器

    项目地址:https://gitcode.com/ForeverZack/Unity-Gpu-Skinning-Tool 在Unity引擎的世界里,Unity GPU Skinning Tool是一个强大的工具,它将骨骼动画计算从CPU转移到GPU,显著提高了游戏中的角色动画性能。对于那些需要大量3D角色与复杂动画的游戏开发者而言,这是一个非常值得尝试的技术。 Un

    2024年04月25日
    浏览(41)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(52)
  • unity 之 GetComponent 获取游戏对象上组件实例方法

    GetComponent 是Unity引擎中用于获取游戏对象上组件实例的方法。它允许您从游戏对象中获取特定类型的组件,以便在脚本中进行操作和交互。 GetComponent ComponentType (): 这是一个泛型方法,用于从当前游戏对象上获取指定类型的组件。在 ComponentType 部分,您应该提供您想要获取的

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包