浅谈Unity之生成水平面的网格线

简介: RenderFeature的应用(生成水平面的网格线)

前言:每日记录自己学习unity的心得和体会,小弟才疏学浅,如有错误的地方,欢迎大佬们指正,感谢~


创建流程

创建RenderFeature模板

编写CommandBuffer生成网格方法

增加到 渲染管线资产

创建RenderFeature模板

在Project面板Create→Rendering→URP Renderer Feature,默认命名为CustomRenderPassFeature

简介


URP Renderer Feature模板继承ScriptableRendererFeature


ScriptableRendererFeature由两个类 CustomRenderPassFeature 与 CustomRenderPass 组成,CustomRenderPass继承ScriptableRenderPass


ScriptableRendererFeature

Create:是用来初始化这个 Feature 的资源


AddRenderPasses:在 Renderer 中插入一个或多个 ScriptableRenderPass


ScriptableRenderPass

Configure :在执行渲染过程之前,Renderer 将调用此方法


Execute:是这个类的核心方法,定义我们的执行规则 ,实现渲染逻辑


FrameCleanup:可用于释放通过此过程创建的分配资源


编写CommandBuffer生成网格方法

在创建的RenderFeature模板中编写脚本如下:

using UnityEngine;

using UnityEngine.Rendering;

using UnityEngine.Rendering.Universal;


public class CustomRenderPassFeature : ScriptableRendererFeature

{

 

   public float lineCount;

 

   class CustomRenderPass : ScriptableRenderPass

   {

       public float lineCount;

       public   bool isRender = false;

       public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)

       {

            if (!Application.isPlaying|| !isRender) return;

           ProfilingSampler mProfilingSampler = new ProfilingSampler("Test1");

           CommandBuffer cmd = CommandBufferPool.Get("Test1 Cmd");

           Material cmdMat1 = new Material(Shader.Find("Models/LineShader"));

           using (new ProfilingScope(cmd, mProfilingSampler))

           {

               Mesh meshRenderer = CreateGridMesh(Color.green, lineCount);

               cmd.DrawMesh(meshRenderer, Matrix4x4.identity, cmdMat1);

               context.ExecuteCommandBuffer(cmd);

               CommandBufferPool.Release(cmd);

           }

       }


     /// <summary>

     /// 创建网格

     /// </summary>

     /// <param name="color"></param>

     /// <param name="spacing"></param>

     /// <param name="linesCount"></param>

     /// <returns></returns>

       public Mesh CreateGridMesh(Color color, float spacing, int linesCount = 150)

       {

           int count = linesCount / 2;

           Mesh mesh = new Mesh();

           mesh.name = "Grid " + spacing;

           int index = 0;

           int[] indices = new int[count * 8];

           Vector3[] vertices = new Vector3[count * 8];

           Color[] colors = new Color[count * 8];

           for (int i = -count; i < count; ++i)

           {

               vertices[index] = new Vector3(i * spacing, 0, -count * spacing);

               vertices[index + 1] = new Vector3(i * spacing, 0, count * spacing);


               vertices[index + 2] = new Vector3(-count * spacing, 0, i * spacing);

               vertices[index + 3] = new Vector3(count * spacing, 0, i * spacing);


               indices[index] = index;

               indices[index + 1] = index + 1;

               indices[index + 2] = index + 2;

               indices[index + 3] = index + 3;

               colors[index] = colors[index + 1] = colors[index + 2] = colors[index + 3] = color;

               index += 4;

           }

           Debug.Log(vertices.Length);

           mesh.vertices = vertices;

           mesh.SetIndices(indices, MeshTopology.Lines, 0);

           return mesh;

       }

   }

   CustomRenderPass m_ScriptablePass;


   /// <inheritdoc/>

   public override void Create()

   {

       m_ScriptablePass = new CustomRenderPass();

       m_ScriptablePass.lineCount = lineCount;

       m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;

   }

   /// <summary>

   /// 用于修改参数

   /// </summary>

   public void SetParam()

   {

       m_ScriptablePass.isRender = true;

       m_ScriptablePass.lineCount = lineCount;

   }


   public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)

   {

       renderer.EnqueuePass(m_ScriptablePass);

   }

}

LineShader

Shader "Models/LineShader"

{

Properties

{

 _Color("Color", Color) = (1, 1, 1, 1)

 [Enum(Off,0,On,1)]_ZWrite("ZWrite", Float) = 1.0

}


SubShader

{

 Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }

 LOD 100


 Pass

 {

  ZWrite[_ZWrite]

  Blend SrcAlpha OneMinusSrcAlpha

  CGPROGRAM

  #pragma vertex vert

  #pragma fragment frag

  // make fog work

  #pragma multi_compile_fog


  #include "UnityCG.cginc"


  struct appdata

  {

   float4 vertex : POSITION;

  };


  struct v2f

  {

   float4 vertex : SV_POSITION;

  };


  fixed4 _Color;


  v2f vert(appdata v)

  {

   v2f o;

   o.vertex = UnityObjectToClipPos(v.vertex);

   return o;

  }


  fixed4 frag(v2f i) : SV_Target

  {

   return _Color;

  }

  ENDCG

 }

}

}

相关文章
|
存储 缓存 算法
【计算机网络】数据链路层
【计算机网络】数据链路层
1695 0
【计算机网络】数据链路层
|
Java Linux
java查看CPU使用过高(linux)
java查看CPU使用过高(linux)
257 0
|
缓存 安全 Linux
强大的动画插件——DOTween介绍(Unity3D)
DOTween是一个用于Unity的快速、高效、完全类型安全的面向对象动画引擎,为c#用户进行了优化,是免费和开源的,具有大量高级特性 DOTween兼容Unity 2019至4.6版本。 适用于:Win, Mac, Linux, Unity WebPlayer, WebGL, iOS, Android, Windows Phone, Windows Store, PS Vita (PSM), PS3/PS4, Xbox 360/One,任天堂Switch + more(没有测试额外的平台,但除了Flash导出,它应该可以在任何地方工作)
|
Web App开发 移动开发 iOS开发
HTML5 Audio(音频)
HTML5 Audio 标准允许网页直接播放音频文件,无需依赖插件。通过 `&lt;audio&gt;` 标签,开发者可以在网页中嵌入音频,支持多种格式如 MP3、WAV 和 Ogg。主流浏览器如 IE9+、Firefox、Chrome、Safari 和 Opera 均支持此功能,但不同浏览器对音频格式的支持存在差异。使用 `&lt;source&gt;` 标签可指定多个源文件,确保兼容性。
|
数据采集 机器学习/深度学习 API
爬虫过程中如何处理验证码?
【2月更文挑战第22天】【2月更文挑战第69篇】 爬虫过程中如何处理验证码?
1093 1
|
SQL 存储 数据处理
SQL中的运算符:数据操作的核心工具
【8月更文挑战第31天】
1169 0
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
安全 API
Vue3 proxy 解决跨域
jsonp 这种方式在之前很常见,他实现的基本原理是利用了HTML里script元素标签没有跨域限制 动态创建script标签,将src作为服务器地址,服务器返回一个callback接受返回的参数
766 0
Vue3 proxy 解决跨域
|
Prometheus 监控 Cloud Native
Prometheus 社区与生态发展
【8月更文第29天】Prometheus 是一个开源的监控系统和时间序列数据库,以其简单易用、高性能的特点受到了广泛欢迎。自 2012 年成立以来,Prometheus 社区迅速壮大,形成了一个庞大且活跃的技术生态系统。本文将探讨 Prometheus 社区的发展趋势、相关项目和工具,以及如何参与贡献。
492 1
直方图的绘制 基于python-matplotlib库
直方图的绘制 基于python-matplotlib库
679 0
直方图的绘制 基于python-matplotlib库

热门文章

最新文章