URP简洁的instance的写法

2024-08-30 06:12
文章标签 写法 简洁 instance urp

本文主要是介绍URP简洁的instance的写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

材质还是要开启enable instance,这是上一次的写法
https://dbbh666.blog.csdn.net/article/details/136644181
最近发现更适合我个人的习惯的写法
就是代码控制这个整个过程
C#代码是这样的,获取一个mesh,获取每个mesh的transform,核心就完了,我这里是场景里的cube的mesh取来直接使用

using UnityEngine;public class DrawMeshInstancedDemo : MonoBehaviour
{// Material to use for drawing the meshes.public Material material;private Matrix4x4[] matrices;//private MaterialPropertyBlock block;private Mesh mesh;private void Setup(){float range = 100.0f;int population = 1023;//Mesh mesh = CreateQuad();GameObject gameObject = GameObject.Find("Cube");MeshFilter mf = gameObject.GetComponent<MeshFilter>();this.mesh = mf.mesh;matrices = new Matrix4x4[population];//Vector4[] colors = new Vector4[population];//block = new MaterialPropertyBlock();for (int i = 0; i < population; i++){Vector3 position = new Vector3(Random.Range(-range, range), Random.Range(-range, range), Random.Range(-range, range));Quaternion rotation = Quaternion.Euler(Random.Range(-180, 180), Random.Range(-180, 180), Random.Range(-180, 180));Vector3 scale = Vector3.one;matrices[i] = Matrix4x4.TRS(position, rotation, scale); }// Custom shader needed to read these!!//block.SetVectorArray("_Colors", colors);}private void Start(){Setup();}private void Update(){// Draw a bunch of meshes each frame.Graphics.DrawMeshInstanced(mesh, 0, material, matrices, 1023 /*block*/);}
}

然后就是shader,有几点要注意的
pragma这里有个#pragma multi_compile_instancing
宏有这几个
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_SETUP_INSTANCE_ID(i)
#ifdef UNITY_INSTANCING_ENABLED //o.color = _Colors[instanceID];
#endif
这几个宏,都要放在对的位置,才能获取正确的变量
`Shader “Unlit/instance”
{
Properties
{
_MainTex (“Texture”, 2D) = “white” {}
}
SubShader
{
Tags { “RenderType”=“Opaque” }
LOD 100

    Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancing// make fog work//#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata_t{float4 vertex : POSITION;float2 uv : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;//UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};// float4 _Colors[1023];   // Max instanced batch size.sampler2D _MainTex;float4 _MainTex_ST;v2f vert(appdata_t i, uint instanceID: SV_InstanceID) {// Allow instancing.UNITY_SETUP_INSTANCE_ID(i);v2f o;//UNITY_TRANSFER_FOG(o,o.vertex);o.vertex = UnityObjectToClipPos(i.vertex);o.uv = i.uv;// If instancing on (it should be) assign per-instance color.#ifdef UNITY_INSTANCING_ENABLED //o.color = _Colors[instanceID];#endifreturn o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_MainTex, i.uv);// apply fog//    UNITY_APPLY_FOG(i.fogCoord, col);col.gb=fixed2(0.2,0.2);return col;}ENDCG}
}

}
`
这样创建一个空对象,把C#脚本挂上去即可
看效果,最中间那个是原始cube,其他的都是instance搞出来的
需要注意的地方是1023这个事情,可能用纹理可以绕过去
在这里插入图片描述

这篇关于URP简洁的instance的写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

OpenStack实例操作选项解释:启动和停止instance实例

关于启动和停止OpenStack实例 如果你想要启动和停止OpenStack实例时,有四种方法可以考虑。 管理员可以暂停、挂起、搁置、停止OpenStack 的计算实例。但是这些方法之间有什么不同之处? 目录 关于启动和停止OpenStack实例1.暂停和取消暂停实例2.挂起和恢复实例3.搁置(废弃)实例和取消废弃实例4.停止(删除)实例 1.暂停和取消暂停实例

『功能项目』更换URP场景【32】

上一章已经将项目从普通管线升级到了URP管线 现在我们打开上一篇31项目优化 - 默认管线转URP的项目, 进入战斗场景 将Land的子级全部隐藏 将新的URP场景预制体拖拽至Land子级 对场景预制体完全解压缩 将Terrain拖拽至Land的直接子级 将Terrain设置为Land 与 静态Static 清除烘培 重新烘培 修改脚本:LoadRe

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果,效果如下: Unity URP遮挡高亮 实现步骤 创建层级,为需要显示高亮效果的物体添加层级,比如Player 创建一个材质球,也就是高亮效果显示的材质球找到Universal Renderer Data Assets 4.在Assets上添加两个Render Objects组件 第一个做如下三处设置 指定遮挡层级指

Emlog模板-简洁大气的资源下载站PHP源码

模板介绍 Emlog模板-简洁大气的资源下载站PHP源码 模板留白简洁大气,首页ajax加载下一页,这是纯模板,安装需要先安装好emlog系统,再把模板文件上传到Emlog模板目录,后台选择模板就可以了,非常简单。 模板下载 Emlog模板-简洁大气的资源下载站PHP源码

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我们在项目中如何灵活应用hibernate,也会给项目维护以及项目开发带来便利,下面我将展示我们项目中是如何来对hibernate进行应用和操作。 【目录】              -

【深度学习】线性回归的从零开始实现与简洁实现

前言 我原本后面打算用李沐老师那本《动手学深度学习》继续“抄书”,他们团队也免费提供了电子版(https://zh-v2.d2l.ai/d2l-zh-pytorch.pdf)。但书里涉及到代码,一方面展示起来不太方便,另一方面我自己也有很多地方看不太懂。 这让我开始思考起我“抄书”的意义了。如果都是文字,我感觉抄起来可以加深印象,在抄的同时理解并思考。 但是如果涉及到代码,我没办法在抄的时候

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

前段百科---JS中形如(function(window, undefined) {})(window)写法的理解

在Web开发过程中,往往会看到有人这样编写JS脚本: (function(window, undefined) {//do something})(window);可能有人会问: 卧槽,这是什么鬼? OK,且听我慢慢道来: 首先,(function(window, undefined) {})(window)可以简化看成这样()();而()()就是一个匿名函数自执行的写法.

简洁直白的github快速入门教程(云主机)

如果你不是云主机,也可以使用本地的linux,这里不提供windows的解决方案! 1. 在云主机上安装 Git 首先,确保你的云主机上安装了 Git。你可以使用以下命令来安装它: # 对于 Debian/Ubuntu 系统sudo apt-get updatesudo apt-get install git# 对于 CentOS/RHEL 系统sudo yum install git