[Unity]用同一份material在不同mesh上绘制不同图案

2024-04-13 10:32

本文主要是介绍[Unity]用同一份material在不同mesh上绘制不同图案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设游戏中有256个相同材质的物体上要分别绘制数字1~256,需要占256个drawcall吗?可以batch到1个drawcall吗?

简化一下问题:假如有4个Plane,我们要用下面这张材质分别在它们上面画1,2,3,4四个数字,可以做到只消耗一个drawcall吗?当然可以,关键就是使用顶点色保存uv信息.因为我们不能把uv信息保存在material中或者运行时给它赋值(会破坏batching),(关于划掉的部分,运行时也可以赋值而不破坏batching,只不过需要一些步骤,参考文末的gpu instancing的文章)所以我们要把信息存到模型本身上.

给每个模型挂一个脚本TestMeshColor.cs来设置它的顶点色(让美术自己出256个不同模型怕是美术要弄死你,包容量也不允许)代码如下:

using UnityEngine;
public class TestMeshColor : MonoBehaviour
{private Mesh mesh;public Color color;void Start (){mesh = GetComponent<MeshFilter>().mesh;Color[] colors = new Color[mesh.vertexCount];for (int i = 0; i < colors.Length; i++)colors[i] = color;mesh.colors = colors;}
}

 

然后在Inspector里输入public color的值(当然也可以用代码赋值).顶点色rgba四个通道,正好可以存Tiling x,y和Offset x,y,这里我们只用r和g通道存Offset,分别取(0,0),(0,1),(1,0),(1,1).

Tiling直接写在Material里(因为4个Plane的Tiling是一样的).

 

然后在Plane的shader中读取顶点色并转换为相应的uv:

Shader "Custom/TestMeshColor"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }Cull OffPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata_full v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv += float2(v.color.x * 256 / 2, v.color.y * 256 / 2);//这里v.color要乘以256还原回来return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}}
}

结果如下(要运行起来哈不然没刷顶点色你会发现全是3),注意背景占掉了一个drawcall所以drawcall是2.有人问为什么顺序不是1,2,3,4啊,因为Offset的y是下方0上方1.这个我就不细调了反正知道意思就行了.

如果模型本身已经有顶点色了,可以尝试用MeshRenderer.additionalVertexStream再加一套UV来存信息,不过我没有试过,是老外一个帖子中提到的:https://forum.unity.com/threads/how-to-use-different-property-in-one-materials-shader.438588/

补充:

其实还有更简单的办法,用gpu instancing,传送门:

https://catlikecoding.com/unity/tutorials/rendering/part-19/

 

其他参考链接:

1.https://answers.unity.com/questions/1258951/changing-vertex-colors-break-batching.html

2.https://forum.unity.com/threads/tricks-for-dynamically-batching-materials-that-need-to-change-color.448821/

 

 

这篇关于[Unity]用同一份material在不同mesh上绘制不同图案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899889

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相