【unity】RenderFeature的应用(生成水平面的网格线)

【unity】RenderFeature的应用(生成水平面的网格线)

在URP里RenderFeature是用于后处理效果上的,也还可以实现一些特殊的效果,比如生成网格线。我们可以使用 CommandBuffer来创建地面网格,这样的话可以通过调整 CommandBuffer的参数来控制地面网格的密度。

实现效果

创建流程

  1. 创建RenderFeature模板
  2. 编写CommandBuffer生成网格方法
  3. 增加到 渲染管线资产

创建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) 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.lineCount = lineCount;}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){renderer.EnqueuePass(m_ScriptablePass);}
}

增加到渲染管线资产(RenderPipelineAsset)

  • 找到URP Asset(位置: Edit→ProjectSetting→Quality→Rendering→RenderPipelineAsset)
  • 找到URP Universal Renderer(位置:URP Asset→Rendering→RendererList)
  • 增加Renderer Feature,点击URP Universal Renderer的Add Renderer Feature添加之前创建的Renderer Feature模板

补充

RenderFeature模板自定义参数调整方法

方法一:

    CustomRenderPassFeature custom=renderData.rendererFeatures.OfType<CustomRenderPassFeature>().FirstOrDefault();custom.lineCount =200;custom.SetParam();

方法二:

    [SerializeField]    UniversalRendererData renderData;List<ScriptableRendererFeature> rendererFeatures;Dictionary<string, ScriptableRendererFeature> innerFeatures = new Dictionary<string, ScriptableRendererFeature>();CustomRenderPassFeature custom;void Start(){rendererFeatures = renderData.rendererFeatures;for (int i = 0; i < rendererFeatures.Count; i++){var feature = rendererFeatures[i];innerFeatures[feature.name] = feature;}ScriptableRendererFeature rendererFeature;innerFeatures.TryGetValue("CustomRenderPassFeature", out rendererFeature);custom = rendererFeature as CustomRenderPassFeature;}
void SetParam()
{custom.lineCount = 200;custom.SetParam();    
}

内置渲染管线使用 CommandBuffer来创建地面网格

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;public class CommandBufferTest : MonoBehaviour
{CommandBuffer cmdBuffer;public Material cmdMat1;public Camera mainCamera;public float m_alpha = 1.0f;bool m_zTest = false;Mesh m_grid0Mesh;private void Start(){cmdBuffer = new CommandBuffer() { name = "CameraCmdBuffer" };mainCamera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, cmdBuffer);m_zTest = true;DrawMesh();}//关机调用void OnDestroy(){Cleanup();}//卸载调用void OnDisable(){Cleanup();}//载入调用void OnEnable(){if (m_zTest)DrawMesh();}public void DrawMesh(){cmdBuffer.Clear();m_grid0Mesh = CreateGridMesh(Color.green, 10);cmdBuffer.DrawMesh(m_grid0Mesh, Matrix4x4.identity, cmdMat1);}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;}mesh.vertices = vertices;mesh.SetIndices(indices, MeshTopology.Lines, 0);return mesh;}private void Cleanup(){if (m_grid0Mesh != null){Destroy(m_grid0Mesh);}}
}

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 100Pass{ ZWrite[_ZWrite]Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#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}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

近日&#xff0c;ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目。它所使用的GPT技术基础为人工智能应用开启了全新的世界。 “大模型时代已经到来。它已变成基础设施&#xff0c;变成算力&#xff0c;变成生产力。大模型可能有通用技术&#xf…

MidJourney v5.2 、Stable Diffusion XL 0.9 出图对比

最近两个最流行的AI图像生成器&#xff0c;Midjourney和Stable Diffusion&#xff0c;都发布了重大更新。Midjourney v5.2引入了许多新功能&#xff0c;包括“缩小”功能、“/缩短”命令、改进的图像质量等。 Stable Diffusion XL (SDXL) 0.9则专注于改善图像质量和构图。新模…

在linux中快速安装Redis数据库

Redis中文网 点击该链接下载最5.0.4版本的Redis的压缩包 使用Xftp工具将Redis安装包上传到linux中 1.将压缩包解压到/opt目录下: tar -zxvf redis-5.0.4.tar.gz 2. 更新yun: sudo yum makecache fast 3.安装gcc: yum -y install gcc 4.安装完成通过输入 : gcc -v …

黑马Java项目实战-瑞吉外卖-笔记01

视频地址&#xff1a;黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目_哔哩哔哩_bilibili资料下载&#xff1a;百度网盘【黑马程序员-Java瑞吉外卖-企业级项目实战-平台实战开发】 黑马Java项目实战-瑞吉外卖-笔…

接口测试必备技能-常见接口协议解析

服务与服务之间传递数据包&#xff0c;往往会因为不同的应用场景&#xff0c;使用不同的通讯协议进行传递。比如网站的访问&#xff0c;常常会使用 HTTP 协议进行传递&#xff0c;文件传输使用 FTP&#xff0c;邮件传递使用 SMTP。上述的三种类型的协议都处于网络模型中的应用层…

Hello算法笔记之回溯

一、回溯算法介绍&#xff1a;一种通过穷举来解决问题的方法&#xff0c;它的核心思想是从一个初始状态出发&#xff0c;暴力搜索所有可能的解决方案&#xff0c;当遇到正确的解则将其记录&#xff0c;直到找到解或者尝试了所有可能的选择都无法找到解为止。 通常采用「深度优…

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…

认识CSS

hi,大家好,今天我们来简单认识一下前端三剑客之一的CSS 目录 &#x1f437;CSS是什么&#x1f437;基本语法规范&#x1f437;CSS引入方式&#x1f95d;内部样式&#x1f95d;外部样式&#x1f95d;内联样式 &#x1f437;认识选择器&#x1f349;标签选择器&#x1f349;类选…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式&#xff1a;三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01; 也许一个人独行&#xff0c;可以走的很快…

高性能计算开发软件培训班-选猿代码科技IT培训机构!

学习CPU并行程序性能优化的意义&#xff1a; 学习CPU计算是现代计算机科学中不可或缺的一部分。掌握CPU计算原理和应用&#xff0c;能够提高我们的编程技能和解决问题的能力&#xff0c;帮助我们更好地应对计算机科学领域中的挑战和机遇。此外&#xff0c;CPU计算在计算机体系结…

如何动手用js自己写一个分页?

实现效果 实现代码 function generateTableHead() {const tableHead document.getElementById(table-head);tableHead.innerHTML ;// 添加复选框列的表头const checkboxHead document.createElement(th);const checkbox document.createElement(input);checkbox.type che…

nginx的安装与自启动配置

1. nginx源码下载 nginx源码下载 2. nginx编译安装 2.1 解压安装包 tar -zxvf nginx-1.24.0.tar.gz2.2 编译安装 cd nginx-1.24.0 ./configure make make install执行./configure时可能出现如下的error&#xff0c;需要安装依赖库&#xff1a; 缺少pcre库 下载pcre安装包…