unity urp 描边
时间: 2025-01-16 18:35:26 浏览: 71
### 如何在 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组件,确保其被正确加载至当前使用的管线版本之中。这样当运行游戏时就会自动应用所设置好的描边样式给指定的对象了。
阅读全文
相关推荐

















