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

Unity的GPU Instancing技术

首先新建一个场景,添加一个相机,并创建一个Render Texture给相机。

然后在相机上挂载以下脚本TestBatches ,同时脚本的Inspector面板的Mesh中选择Cube,另外创建一个新的材质拖动给mat:

public class TestBatches : MonoBehaviour
{
    public Mesh mesh;
    public Material mat;
    
    
    private void OnRenderObject()
    {
        Graphics.DrawMesh(mesh,Vector3.zero,Quaternion.identity,mat,0);
    }
}

运行Unity则可以看到一个Cube:

这里可以看到DrawCall数量为36个,以为相机本身有10个DrawCall,所以等于这个Cube的绘制有16个DrawCall。

然后我们修改代码为,就会发现DrawCall数量增加到了52个,因为36+16=52

    private void OnRenderObject()
    {
        Graphics.DrawMesh(mesh,Vector3.zero,Quaternion.identity,mat,0);
        Graphics.DrawMesh(mesh,Vector3.zero,Quaternion.identity,mat,0);
    }

那么我们如何可以通过其他方式绘制出同样的两个Cube,而不增加DrawCall数量呢,接下来我们使用Gpu Instancing的方式,首先开启材质的Instancing开关:

然后修改代码,使用Graphics.DrawMeshInstanced接口绘制:

public class TestBatches : MonoBehaviour
{
    public Mesh mesh;
    public Material mat;
    private Matrix4x4[] m_atrix4x4s = new Matrix4x4[2];
    
    private void Start()
    {
        // 初始化两个矩阵以定义两个物体的位置、旋转和缩放
        m_atrix4x4s[0] = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one); // 第一个物体位置
        m_atrix4x4s[1] = Matrix4x4.TRS(new Vector3(2, 0, 0), Quaternion.identity, Vector3.one); // 第二个物体位置,相对于第一个物体偏移
    }
    private void OnRenderObject()
    {
        //Graphics.DrawMesh(mesh,Vector3.zero,Quaternion.identity,mat,0);
        // 使用 DrawMeshInstanced 绘制两个物体
        Graphics.DrawMeshInstanced(mesh, 0, mat, m_atrix4x4s);
    }
    
}

可以看到绘制了两个同样的Cube但DrawCall数量没有增加:


http://www.kler.cn/a/415259.html

相关文章:

  • GaussDB高智能--智能优化器介绍
  • STM32-- 看门狗--介绍、使用场景、失效场景
  • BASLER工业相机维修不能触发拍照如何处理解决这个问题
  • 百度智能云千帆部署流程---语音识别和合成
  • 工业AI质检 AI质检智能系统 尤劲恩(上海)信息科技有限公司
  • Git上传本地项目到远程仓库(gitee/github)
  • 智能驾驶,车联网,传感器,车载电子集中展示|2025北京自动驾驶展
  • 欧科云链研究院:比特币还能“燃”多久?
  • 【vue-router】Vue-router如何实现路由懒加载
  • Spring Boot 3.x 多环境配置详解
  • vscode、android studio、vim 国产AI编程插件Fitten Code
  • nVisual可视化资源管理工具
  • com.alibaba.fastjson.JSONException: not close json text, token : error
  • HTTPS 的应用数据是如何保证完整性的?
  • 玩转 uni-app 静态资源 static 目录的条件编译
  • 【Linux】线程同步与互斥 (生产者消费者模型)
  • C#:时间与时间戳的转换
  • 一文解析Kettle开源ETL工具!
  • 评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分
  • Day31 贪心算法 part05
  • ChatGPT 网络安全秘籍(二)
  • 《普通逻辑》学习记录——复合命题和复合推理
  • 视觉语言模型(VLM)学习笔记
  • 楼顶气膜馆:引领科技感与声学完美结合的未来会议空间—轻空间
  • 40分钟学 Go 语言高并发:Go程序性能优化方法论
  • JVM:即时编译器,C2 Compiler,堆外内存排查