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

首先,在Shader层面,_CameraColorTexture(或通过TEXTURE2D(_MainTex)声明)是执行颜色抓取的核心载体。该纹理由URP渲染管线在渲染流程的特定阶段(通常是在不透明和透明对象渲染之后,后处理开始之前)自动生成并填充为当前摄像机的渲染结果。在提供的径向模糊Shader中,此纹理以_MainTex的形式被访问。其关键实现步骤如下:
- 纹理声明与采样器定义:在HLSL代码块中,使用URP提供的宏
TEXTURE2D(_MainTex)和SAMPLER(sampler_MainTex)来声明屏幕颜色纹理及其采样器。这确保了与URP内部纹理管理机制的正确对接。 - 纹理坐标传递:顶点着色器(
Vert函数)将模型的空间顶点位置(positionOS)转换至齐次裁剪空间(positionCS),并将原始的UV坐标(uv)直接传递给片段着色器。这些UV坐标(范围0到1)对应着屏幕空间,用于在_CameraColorTexture上进行精确采样。 - 径向模糊算法与纹理采样:在片段着色器(
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),从而组织起完整的“抓取-处理-写回”流程。该流程具体如下:
- 纹理获取与参数传递:在
RadialBlurPass.Execute方法中,首先通过renderingData.cameraData.renderer.cameraColorTargetHandle获取当前摄像机渲染目标的句柄,这个句柄通常就指向_CameraColorTexture或其等效的Render Texture。然后,将脚本中设置的模糊参数(强度、半径、采样次数、中心点)通过Material.SetFloat和Material.SetVector方法传递给Shader。 - 双次Blit渲染操作:
- 第一次Blit(应用效果):使用
Blitter.BlitCameraTexture命令,将源纹理(即_CameraColorTexture)作为输入,应用配置好的径向模糊材质(m_Material),并将处理结果渲染到一个临时分配的渲染纹理(m_TemporaryColorTexture)中。这一步完成了对屏幕颜色纹理的“抓取”与“处理”。 - 第二次Blit(写回结果):再次使用
Blitter.BlitCameraTexture命令,将临时纹理中的处理结果拷贝回源纹理(即摄像机颜色目标)。这一步将处理后的图像“写回”到管线,替换原始的屏幕图像,从而在屏幕上呈现出径向模糊效果。
- 第一次Blit(应用效果):使用
整个过程的关键参数配置如下表所示,它们共同决定了最终模糊效果的视觉表现:
| 参数 | 在屏幕颜色抓取与处理流程中的作用 |
|---|---|
blurStrength | 控制径向采样偏移量的缩放因子,直接影响模糊的视觉强度。值越大,每次采样的偏移距离越长,模糊感越强。 |
blurRadius | 定义采样操作的最大空间范围(以UV坐标距离衡量)。它决定了模糊效果能从中心点向外影响多远的像素。 |
sampleCount | 决定沿径向方向进行颜色采样的次数。更高的采样次数能产生更平滑的模糊效果,但会线性增加GPU的片段着色器计算负荷。 |
centerX, centerY | 定义径向模糊效果的中心点在屏幕空间(UV坐标,0-1范围)的位置。所有像素的模糊方向都将以此点作为原点向外辐射。 |
为了优化性能,在实践中有以下建议:对于移动平台,应将sampleCount控制在8-12之间以平衡质量与帧率;可以通过在Shader中预先计算并重用方向向量等中间结果来减少重复计算;确保在不需显示效果时(例如角色静止时),通过enableEffect参数完全禁用该Renderer Feature,以避免任何不必要的渲染开销。

1万+

被折叠的 条评论
为什么被折叠?



