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

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 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

 }

}

}

相关文章
|
11月前
|
存储 数据库
掌握GitLab数据备份与恢复:全面操作指南
【10月更文挑战第11天】 GitLab作为一个流行的开源代码仓库管理系统,其数据的安全性和完整性至关重要。本文将详细介绍GitLab数据的备份与恢复流程,帮助用户掌握如何保护和管理他们的GitLab实例。
1023 0
|
图形学
浅谈Unity之ShaderGraph-等高线和高程渐变设色
ShaderGraph实现等高线和高程渐变设色
|
数据处理
锁降级
锁降级
916 0
|
11月前
ThreeJs添加拖动辅助线
这篇文章介绍了在Three.js中使用TransformControls组件来添加拖动辅助线,实现对3D模型在不同轴向上进行直观的拖动和平移操作。
354 0
|
11月前
|
容器
ThreeJs同一个场景多个相机的显示
这篇文章讲解了如何在Three.js中实现多相机功能,通过创建和布置多个相机及渲染器,从而能够在同一场景中从不同角度观察3D模型。
263 1
|
10月前
|
Web App开发 移动开发 iOS开发
HTML5 Audio(音频)
HTML5 Audio 标准允许网页直接播放音频文件,无需依赖插件。通过 `&lt;audio&gt;` 标签,开发者可以在网页中嵌入音频,支持多种格式如 MP3、WAV 和 Ogg。主流浏览器如 IE9+、Firefox、Chrome、Safari 和 Opera 均支持此功能,但不同浏览器对音频格式的支持存在差异。使用 `&lt;source&gt;` 标签可指定多个源文件,确保兼容性。
|
图形学
unity判断鼠标在不在UI上
unity判断鼠标在不在UI上
|
C++ Windows
【Visual Studio Code----Shader编程环境配置】
【Visual Studio Code----Shader编程环境配置】
|
SQL 存储 数据处理
SQL中的运算符:数据操作的核心工具
【8月更文挑战第31天】
896 0
|
数据可视化 机器人 Python
实例9:四足机器人运动学正解平面RR单腿可视化
本文是关于四足机器人正向运动学(FK)的实例教程,通过Python编程实现了简化的mini pupper平面二连杆模型的腿部可视化,并根据用户输入的关节角计算出每个关节相对于基坐标系的坐标。
271 1

热门文章

最新文章