利用_CameraColorTexture实现径向模糊

在Unity URP中,利用_CameraColorTexture完成屏幕颜色抓取以实现径向模糊,其核心机制在于通过URP的Render Pass架构,在特定的渲染事件节点访问由管线自动生成的摄像机颜色纹理,并将其作为后处理效果的输入源。该过程主要包含两个层面:Shader层对纹理的采样与处理,以及C#脚本层(Renderer Feature)对渲染流程和纹理资源的调度。

首先,在Shader层面,_CameraColorTexture(或通过TEXTURE2D(_MainTex)声明)是执行颜色抓取的核心载体。该纹理由URP渲染管线在渲染流程的特定阶段(通常是在不透明和透明对象渲染之后,后处理开始之前)自动生成并填充为当前摄像机的渲染结果。在提供的径向模糊Shader中,此纹理以_MainTex的形式被访问。其关键实现步骤如下:

  1. 纹理声明与采样器定义:在HLSL代码块中,使用URP提供的宏TEXTURE2D(_MainTex)SAMPLER(sampler_MainTex)来声明屏幕颜色纹理及其采样器。这确保了与URP内部纹理管理机制的正确对接。
  2. 纹理坐标传递:顶点着色器(Vert函数)将模型的空间顶点位置(positionOS)转换至齐次裁剪空间(positionCS),并将原始的UV坐标(uv)直接传递给片段着色器。这些UV坐标(范围0到1)对应着屏幕空间,用于在_CameraColorTexture上进行精确采样。
  3. 径向模糊算法与纹理采样:在片段着色器(Frag函数)中,算法基于当前像素的UV坐标(input.uv)和预设的模糊中心点(_Center)进行计算。核心是沿着从中心到当前像素的径向方向(dir = normalize(uv - center)),通过一个循环进行多次纹理采样。每次采样都通过SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv - offset)函数,从_CameraColorTexture上获取偏移位置的颜色值。其中,offset是根据模糊强度(_BlurStrength)、模糊半径(_BlurRadius)和当前采样步进比例(t)计算得出的径向偏移向量。最终,将所有采样结果按权重混合,得到该像素的径向模糊颜色。

其次,在C#脚本层面,RadialBlurEffect作为ScriptableRendererFeature,负责在URP的渲染管线中插入一个自定义的ScriptableRenderPass(即RadialBlurPass),从而组织起完整的“抓取-处理-写回”流程。该流程具体如下:

  1. 纹理获取与参数传递:在RadialBlurPass.Execute方法中,首先通过renderingData.cameraData.renderer.cameraColorTargetHandle获取当前摄像机渲染目标的句柄,这个句柄通常就指向_CameraColorTexture或其等效的Render Texture。然后,将脚本中设置的模糊参数(强度、半径、采样次数、中心点)通过Material.SetFloatMaterial.SetVector方法传递给Shader。
  2. 双次Blit渲染操作
    • 第一次Blit(应用效果):使用Blitter.BlitCameraTexture命令,将源纹理(即_CameraColorTexture)作为输入,应用配置好的径向模糊材质(m_Material),并将处理结果渲染到一个临时分配的渲染纹理(m_TemporaryColorTexture)中。这一步完成了对屏幕颜色纹理的“抓取”与“处理”。
    • 第二次Blit(写回结果):再次使用Blitter.BlitCameraTexture命令,将临时纹理中的处理结果拷贝回源纹理(即摄像机颜色目标)。这一步将处理后的图像“写回”到管线,替换原始的屏幕图像,从而在屏幕上呈现出径向模糊效果。

整个过程的关键参数配置如下表所示,它们共同决定了最终模糊效果的视觉表现:

参数在屏幕颜色抓取与处理流程中的作用
blurStrength控制径向采样偏移量的缩放因子,直接影响模糊的视觉强度。值越大,每次采样的偏移距离越长,模糊感越强。
blurRadius定义采样操作的最大空间范围(以UV坐标距离衡量)。它决定了模糊效果能从中心点向外影响多远的像素。
sampleCount决定沿径向方向进行颜色采样的次数。更高的采样次数能产生更平滑的模糊效果,但会线性增加GPU的片段着色器计算负荷。
centerX, centerY定义径向模糊效果的中心点在屏幕空间(UV坐标,0-1范围)的位置。所有像素的模糊方向都将以此点作为原点向外辐射。

为了优化性能,在实践中有以下建议:对于移动平台,应将sampleCount控制在8-12之间以平衡质量与帧率;可以通过在Shader中预先计算并重用方向向量等中间结果来减少重复计算;确保在不需显示效果时(例如角色静止时),通过enableEffect参数完全禁用该Renderer Feature,以避免任何不必要的渲染开销。


参考来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值