Unity URP 运行时控制ScriptableRendererFeature

本文介绍了一个使用 Unity 的 ForwardRendererData 初始化特定渲染器 (YourRender) 的过程。通过查找匹配的渲染特性并设置相关参数,确保渲染效果符合预期。
[SerializeField] ForwardRendererData rendererData;

private YourRender yourRender ;

void Start()
{
        yourRender = rendererData.rendererFeatures.OfType<YourRender>().FirstOrDefault();
}
//
yourRender.setitngs.xxxx = xxx;
rendererData.SetDirty();

 

### 如何在 Unity Universal Render Pipeline (URP) 中实现描边效果 为了实现在Unity URP下的物体边缘描边效果,可以采用屏幕空间轮廓线(Screen Space Outlines)的方法。这种方法通过自定义渲染特性(Custom Renderer Feature),能够高效地处理场景内对象的描边需求[^2]。 #### 创建并配置Outline Shader 首先需要创建一个新的Shader文件用于绘制轮廓线条。此着色器应基于`UniversalRenderPipeline/Lit`模板修改而来,在其中加入额外逻辑来检测像素是否位于模型边界处,并据此调整颜色输出以形成可见的外框: ```hlsl // Outline.hlsl #pragma vertex Vert #pragma fragment Frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; }; struct Varyings { float4 posCS : SV_POSITION; }; Varyings Vert(Attributes input){ Varyings output; VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); output.posCS = vertexInput.positionCS; return output; } half4 Frag(Varyings input):SV_Target{ // 这里可以根据具体需求定制化计算方式 half4 color=half4(0,1,0,1); // 默认绿色轮廓 return color; } ``` 接着把上述HLSL代码保存成`.shader`格式文档,并将其关联到Material材质球上以便后续调用。 #### 编写RendererFeature脚本控制描边行为 紧接着要编写一段C#程序作为Custom Renderer Feature的一部分,负责管理整个过程中的资源分配以及参数传递工作。该类继承自`ScriptableRendererFeature`基类,并注册一个名为`DrawOutlinesPass`的新pass实例完成实际绘图操作: ```csharp using UnityEngine.Rendering.Universal; public class DrawOutlinesFeature : ScriptableRendererFeature { public Material outlineMat; private class DrawOutlinesPass : ScriptableRenderPass { private readonly string _profilerTag = "DrawOutlines"; private Material _material; public DrawOutlinesPass(Material material){ this._material = material; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){ CommandBuffer cmd = CommandBufferPool.Get(_profilerTag); var cam = renderingData.cameraData.camera; Blitter.BlitCameraTexture(cmd, _material, cam); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } } [System.Serializable] public class Settings { public bool isEnabled = true; } public Settings settings = new Settings(); private DrawOutlinesPass m_ScriptablePass; /// <inheritdoc/> public override void Create(){ m_ScriptablePass = new DrawOutlinesPass(outlineMat); m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents; } /// <inheritdoc/> public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){ if(settings.isEnabled) renderer.EnqueuePass(m_ScriptablePass); } } ``` 最后一步是在项目的Graphics Setting里面启用这个新的Renderer Feature组件,确保其被正确加载至当前使用的管线版本之中。这样当运行游戏就会自动应用所设置好的描边样式给指定的对象了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值