Unity Shader 屏幕后处理:OnRenderImage 与 RendererFeature实现景深、Bloom、色彩校正

Unity的URP的自定义后处理效果 概述 本来想写这个很久了,但是一直都在忙别的。 最近项目也需要用到URP的后处理,但是不一定有想要的后处理效果。所以有些还是得自己写。 但是URP的后处理和之前unity的后处理写法完全不一样了。原来的OnRenderImage、OnPreRender都失效了。 本文只探讨如何写URP下的自定义后处理,并非讨论具体的渲染效果,这里我只做了修改对比度的屏幕特效。 具体实现 首先需要创建一个自定义的c#的ScriptableRendererFeature和ScriptableRenderPass 阅读详情

1. URP 渲染管线与后处理架构

Unity 的 Universal Render Pipeline(URP) 是基于 ScriptableRenderPipeline 构建的轻量渲染管线,其核心设计思路是:一切渲染步骤都可以在 CPU 侧用 C# 显式编排。这与 Built-in 管线把大量逻辑固化在引擎内部有根本区别。

在后处理这个子域里,两种路径并存:

特性OnRenderImageScriptableRendererFeature
所属管线Built-in / 兼容模式URP 原生
SRP Batcher 兼容不支持支持
移动端 Tile-Based GPU额外 resolve 开销可控 LoadAction
访问深度/法线贴图有限原生支持
Pass 执行时机AfterEverything可自定义任意时机
在 URP 中是否推荐不推荐官方推荐

2. OnRenderImage —— 传统路径

OnRenderImage(RenderTexture src, RenderTexture dst) 是 Built-in 管线遗留的回调。在 URP 中只有摄像机同时挂着 UniversalAdditionalCameraData 并且禁用了某些设置时才能触发,不推荐在生产项目使用,但理解它有助于迁移老项目。

最小示例:灰度滤镜

Shader "Hidden/PostFX/Grayscale"
{
  SubShader {
    // 关掉深度写入,关掉裁剪
    ZTest Always  ZWrite Off  Cull Off
    Pass {
      HLSLPROGRAM
      #pragma vertex   vert
      #pragma fragment frag
      #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
      TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
      struct Varyings {
        float4 posCS : SV_POSITION;
        float2 uv    : TEXCOORD0;
      };
      Varyings vert(uint vertexID : SV_VertexID) {
        Varyings o;
        // 用三角形铺满屏幕,无需顶点缓冲区
        o.uv    = float2((vertexID << 1) & 2, vertexID & 2);
        o.posCS = float4(o.uv * 2.0 - 1.0, 0.0, 1.0);
        return o;
      }
      half4 frag(Varyings i) : SV_Target {
        half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
        // 人眼亮度感知权重:Rec. 709
        half luma = dot(col.rgb, half3(0.2126, 0.7152, 0.0722));
        return half4(luma, luma, luma, col.a);
      }
      ENDHLSL
    }
  }
}
using UnityEngine;
// 挂在摄像机上;URP 中需要关闭后处理堆栈或使用兼容模式
[ExecuteAlways, RequireComponent(typeof(Camera))]
public class GrayscaleEffect : MonoBehaviour
{
    [SerializeField] Material _mat;
    // 每帧在最终图像写入屏幕之前回调
    void OnRenderImage(RenderTexture src, RenderTexture dst)
    {
        if (_mat == null) { Graphics.Blit(src, dst); return; }
        Graphics.Blit(src, dst, _mat, /* passIndex */ 0);
    }
}

⚠ URP 中的限制URP 默认不执行 OnRenderImage。必须在 Universal Renderer Data 里关闭"中间纹理"选项,或直接迁移到 RendererFeature。移动端强烈建议后者,因为前者会强制 GPU 做一次额外的 Resolve。

3. ScriptableRendererFeature —— URP 正统路径

一个完整的 RendererFeature 由两个类组成:

Pass 在 renderPassEvent 中指定执行时机。常用枚举值:

BeforeRendering

→

AfterRenderingOpaques

→

AfterRenderingTransparents

→

AfterRenderingPostProcessing

→

AfterRendering

后处理通常插在 AfterRenderingPostProcessing 之前,以参与 TAA/抖动之前的 HDR 图像。

4. 实现景深(Depth of Field)

景深的核心思路:以深度缓冲判断像素距焦点距离,远离焦点的区域做 CoC(Circle of Confusion)半径扩大,再执行分离式模糊。

实现步骤

整个 DOF Pass 拆成三步:计算 CoC → 散景模糊 → 合成。

public override void Execute(ScriptableRenderContext ctx, ref RenderingData data)
{
    CommandBuffer cmd = CommandBufferPool.Get("DOF Pass");
    // ─── Step 1: 计算每像素 CoC(写入 r 通道)───
    cmd.SetGlobalFloat("_FocusDistance", _settings.focusDistance);
    cmd.SetGlobalFloat("_FocusRange",    _settings.focusRange);
    cmd.SetGlobalFloat("_BokehRadius",  _settings.bokehRadius);
    Blit(cmd, _colorHandle, _cocHandle,  _mat, /* Pass 0: CoC */ 0);
    // ─── Step 2: 散景模糊(分离式,减少采样次数)───
    cmd.SetGlobalTexture("_CoCTex", _cocHandle);
    Blit(cmd, _colorHandle, _blurH,    _mat, /* Pass 1: Bokeh-H */ 1);
    Blit(cmd, _blurH,       _blurV,    _mat, /* Pass 2: Bokeh-V */ 2);
    // ─── Step 3: 与原图按 CoC 合成 ───
    cmd.SetGlobalTexture("_BlurredTex", _blurV);
    Blit(cmd, _colorHandle, _colorHandle, _mat, /* Pass 3: Composite */ 3);
    ctx.ExecuteCommandBuffer(cmd);
    CommandBufferPool.Release(cmd);
}
// 把线性深度映射成 CoC 半径 [-1, 1]
// 负数 = 前景焦外,正数 = 背景焦外,0 = 焦内
half ComputeCoC(float rawDepth) {
    float d = LinearEyeDepth(rawDepth, _ZBufferParams);
    half  coc = (d - _FocusDistance) / _FocusRange;
    return clamp(coc, -1.0, 1.0) * _BokehRadius;
}
half4 FragCoC(Varyings i) : SV_Target {
    // _CameraDepthTexture 由 URP 自动绑定
    float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,
                      sampler_CameraDepthTexture, i.uv);
    half  coc   = ComputeCoC(depth);
    return half4(coc, coc, coc, 1.0);  // 仅用 r 通道
}

💡 性能提示散景模糊在半分辨率 RT 上执行可节省约 75% 填充率。合成时将模糊结果上采样回原分辨率,视觉损失微乎其微。

5. 实现 Bloom(泛光)

Bloom 的经典算法:提取高亮区域 → 多级下采样(构建 Mip 链)→ 逐级上采样(tent 滤波)→ 叠加原图。URP 内置的 Bloom Volume 组件就是这个思路,也可以完全自定义。

half4 FragPrefilter(Varyings i) : SV_Target {
    half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
    // 膝部曲线:平滑截断,避免硬边闪烁
    half brightness = max(color.r, max(color.g, color.b));
    half rq = clamp(brightness - _Threshold + _Knee,
                 0.0, 2.0 * _Knee);
    rq = _Knee2 * rq * rq;  // _Knee2 = 0.25 / (knee + 1e-5)
    half w = max(rq, brightness - _Threshold) / max(brightness, 1e-5);
    return half4(color.rgb * w, 1.0);
}
// 3x3 Tent 滤波:加权 9 次采样,比双线性更平滑
half4 FragUpsample(Varyings i) : SV_Target {
    float2 texel = _BlitTexture_TexelSize.xy;
    half4 s = 0.0;
    // 权重:1/16 * [1 2 1 / 2 4 2 / 1 2 1]
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2(-1,-1)) * 0.0625;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 0,-1)) * 0.125;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 1,-1)) * 0.0625;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2(-1, 0)) * 0.125;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 0, 0)) * 0.25;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 1, 0)) * 0.125;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2(-1, 1)) * 0.0625;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 0, 1)) * 0.125;
    s += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, i.uv + texel * float2( 1, 1)) * 0.0625;
    return s;
}
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class BloomFeature : ScriptableRendererFeature
{
    [System.Serializable]
    public class Settings
    {
        public Shader         shader;
        [Range(0f, 10f)] public float threshold = 1f;
        [Range(0f, 1f)]  public float knee      = 0.5f;
        [Range(0f, 5f)]  public float intensity  = 1f;
        [Range(1,  8)]   public int   iterations = 5;
    }
    public Settings settings = new();
    BloomPass _pass;
    public override void Create()
    {
        _pass = new BloomPass(settings);
        _pass.renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;
    }
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData data)
    {
        // 仅在 Game / Scene 摄像机执行,跳过反射探头等
        if (data.cameraData.cameraType != CameraType.Game) return;
        renderer.EnqueuePass(_pass);
    }
    protected override void Dispose(bool disposing)
        => _pass?.Dispose();
}

6. 实现色彩校正(Color Correction)

色彩校正通常在 Tonemapping 之后、最终 Blit 之前执行,包含三部分:White Balance(色温)→ Lift/Gamma/Gain(三路色轮)→ LUT 查找表映射。

// 色温调整:将 sRGB 转到 CIE XYZ,偏移色温,再转回
half3 WhiteBalance(half3 col, half temp, half tint) {
    // 简化版:直接在 LMS 颜色空间做乘法
    half3 lms = mul(LINEAR_2_LMS_MAT, col);
    lms *= half3(1.0 + temp * 0.1,      // 色温影响 L、M
               1.0 - temp * 0.05,
               1.0 + tint * 0.1);     // 色调影响 S
    return mul(LMS_2_LINEAR_MAT, lms);
}
// 三路色轮调色:暗部 Lift,中间调 Gamma,高光 Gain
half3 LiftGammaGain(half3 col,
                    half3 lift, half3 gamma, half3 gain) {
    col = col * (1.0 - lift) + lift;  // 暗部抬升
    col = col * gain;                   // 高光乘数
    return pow(max(0, col), 1.0 / gamma);// 中间调 Gamma
}
// _LUT: Texture3D,烘焙好的颜色空间映射
TEXTURE3D(_LUT); SAMPLER(sampler_LUT);
float _LUTSize;  // 通常 32
half3 ApplyLUT(half3 col) {
    // 将颜色映射到 [0.5/N, 1 - 0.5/N],避免边缘采样越界
    half  scale  = (_LUTSize - 1.0) / _LUTSize;
    half  offset = 0.5 / _LUTSize;
    half3 uvw    = col * scale + offset;
    return SAMPLE_TEXTURE3D(_LUT, sampler_LUT, uvw).rgb;
}
half4 FragColorGrade(Varyings i) : SV_Target {
    half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
    col.rgb = WhiteBalance(col.rgb, _Temp, _Tint);
    col.rgb = LiftGammaGain(col.rgb, _Lift, _Gamma, _Gain);
    col.rgb = ApplyLUT(col.rgb);  // 最后做 LUT,覆盖所有调整
    return col;
}

📌 关于 LUT 生成LUT 可以在 DaVinci Resolve / Photoshop Camera Raw 中调出风格后导出 .cube 文件,再用 Unity 的 Create > Rendering > Custom Post Process 或自定义工具烘焙成 Texture3D Asset。

7. 性能优化与常见陷阱

7.1 RT 管理

public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData data)
{
    var desc = data.cameraData.cameraTargetDescriptor;
    desc.depthBufferBits = 0;  // 后处理不需要深度写入
    desc.width  /= 2;         // 半分辨率降低填充率
    desc.height /= 2;
    RenderingUtils.ReAllocateIfNeeded(
        ref _halfRT, desc, FilterMode.Bilinear,
        name: "_HalfResBloom");
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
    // 注意:RTHandle 在 Feature.Dispose() 里 Release,这里只解绑
    _halfRT = null;
}

7.2 常见陷阱一览

移动端高危陷阱

  • 在 Tile-Based GPU(Mali/Adreno)上每次 Blit 都触发 Load → Compute → Store,Pass 越多开销越高——合并 Pass
  • DOF 的 CoC 贴图不要用 RGBA32,用 R8 即可,省 4× 带宽
  • half 精度在高动态范围 Bloom 阶段会发生饱和(溢出),请在 HDR RT 中保持 half4(fp16),不要降到 half3

URP API 常见错误

  • URP 14+ 中 ConfigureTarget 已弃用,改用 SetRenderAttachment / SetRenderAttachmentDepth
  • 在 AddRenderPasses 之外调用 ConfigureInput 无效——必须在 AddRenderPasses 里调
  • Blitter.BlitCameraTexture(URP 14+)替代了老式 cmd.Blit,可以正确处理 y-flip

优化建议

  • Bloom 迭代次数 ≤ 5,在低端机上自动减少到 3(按 SystemInfo.graphicsMemorySize 判断)
  • DOF 在场景无深度变化帧跳过 CoC Pass(深度 dirty flag)
  • 色彩校正+Tonemapping 合并成单 Pass,所有调整在一个 Fragment Shader 里完成
  • LUT 尺寸优先用 32³(32×32×32):质量与性能最优平衡点

Unity URP渲染管线---自定义渲染详解(入门) 本篇文章主要介绍URP自定义渲染RendererFeature、RendererPass的使用,并详细解析继承下来的每个方法什么时候会被调用,基础的URP请参考这位博主文章:https://blog.youkuaiyun.com/qq_30259857/article/details/108318528。 测试demo效果 RendererFeature、RendererPass使用 在使用URP的时候先在PackageManager上导入Universal RP 1、当Render... 阅读详情

相关推荐

Unity屏幕后处理:OnRenderImage与RendererFeature方案深度解析

屏幕后处理是实时渲染中提升画面表现力的关键技术,其核心原理是在场景渲染完成后,对最终图像进行像素级处理,如同为画面添加滤镜。从技术实现看,它依赖于着色器算法对渲染纹理进行操作,常见效果包括景深、泛光和色彩校正。在Unity引擎中,实现路径的选择直接影响项目架构与性能。传统内置管线通过OnRenderImage回调实现,简单直接但难以与现代可编程渲染管线集成;而URP/HDRP采用的RendererFeature方案,则以模块化、可配置的设计,通过ScriptableRenderPass精确控制执行时机与资源

weixin_30613433的博客 380

URP---自定义后处理流程

URP—自定义后处理流程 前记:默认的build-in管线的后处理挺简单,但是换了urp还想上后处理,使用这几天进行了学习---------------------mx 屏幕后处理:通常指在渲染完整个场景得到屏幕图像之后再对这个图像进行一系列操作,实现各种屏幕特效。 在build-in的管线中,后处理的基本流程是: 预处理—用于提前检查各种资源和条件是否满足 在OnRenderImage函数中对shader中的变量进行赋值,并根据shader对源图像进行处理 URP后处理前期准备 在包管理器中导入Uni

m0_56399931的博客 2402

Unity URP/HDRP屏幕后处理:从Shader到Renderer Feature的完整实现指南

屏幕后处理是计算机图形学中用于在渲染完成后对最终图像进行二次处理的技术,其核心原理是在渲染管线的最后阶段,通过像素着色器对帧缓冲区的颜色数据进行逐像素操作。这项技术的价值在于能够在不修改原始3D场景的前提下,高效地实现丰富的视觉特效,从而极大地提升了画面的艺术表现力和风格化能力。在游戏开发、影视特效和实时可视化等应用场景中,屏幕后处理是实现Bloom辉光、景深、色彩校正等高级视觉效果的关键手段。本文聚焦于Unity的可编程渲染管线(SRP),特别是URP/HDRP环境,深入讲解如何通过编写自定义Shader

banglvfei0870的博客 330

Unity Render Feature示例

Unity Render Feature示例

五百零一 2722

UnityShader后处理景深效果

UnityShader 后处理景深效果 主要原理是高斯核卷积,并根据深度图采样结果来判断模糊度。 高斯核能反映距离对模糊采样率造成的影响。本例使用的高斯核是5x5尺寸。可以使用双pass的方法把这个高斯核简化成两个一维的高斯核。 在模糊卷积中,把高斯核拆分成两个一维高斯核,在两个pass中分别进行xy方向的卷积。假设先进行了x方向的卷积, 那么y方向用以卷积的参数实际上是x方向上卷积过的。也就是说它也受到了对角线(或者说斜方向)上的影响。 在边缘检测卷积上,xy方向上都使用的是方阵卷积核,并且需要求得的结

ALiang_2685787271的博客 891

unity中的景深效果,shader(CG)

在unity中,正交和透视投影不能用同一shader来实现,在正交投影中,

lynon的专栏 4558

Unity3D Shader:景深

C#代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class JingShen : MonoBehaviour {     public Material mat;     [Range(0f, 100f)]     public float focalD...

weixin_42452001的博客 1632

Unity的URP的自定义后处理效果(三) 之 毛玻璃效果

抓手 本文详说如何在URP管线下做毛玻璃效果。 有两种方法,方法一是用URP自带的OpaqueTexture,但是Opaque是不透明的意思, 所以它的缺陷是半透明的物体它是不会渲染到OpaqueTexture里去的。 方法二是用RendererFeature,本文主要讲第二种方法。 实现原理 先在一帧里用RendererFeature用某个camera截一帧的图。 然后用CommandBuffer做多次高斯模糊,达到这种毛玻璃效果。 最后渲染到一个RenderTexture上。 具体..

zakerhero的博客 1万+

Unity URP渲染管线---实现自定义渲染物体

Unity内置管线是无法实现控制每个层级的渲染,而URP通用渲染管线却给了我们机会,这里就介绍如何自定义渲染。 效果 本次示例场景中有一块plane和几个物体,这里将plane先渲染之后再渲染其他物体, 图中是最终结果。 从FrameDebug中看到了先渲染了Plane,这里不是通过改变单独的RendererQueue实现的,这是相当于自己实现了渲染物体。 原理详解 URP版本10.3.1,Unity2020.2.3 ...

qq_33700123的博客 2742

【Unity URP 后处理】(二)URP 后处理架构入门:RendererFeature、RenderPass、Volume、RTHandle

本文为 URP 后处理系统入门的核心架构篇,针对新手接触 URP 后处理时,对管线各类核心概念混淆、层级边界不清的痛点展开讲解。重点解析了 ScriptableRendererFeature 与 ScriptableRenderPass 的分工、完整生命周期与执行逻辑。全文搭建了完整的 URP 后处理架构认知框架,为后续自定义效果开发筑牢基础。

xuanchi0525的博客 339

Unity Shader-后处理:景深

通过两张图片,一张清晰的,一张经过高斯模糊的,然后根据图片中每个像素的深度值在两张图片之间差值,就可以达到景深的效果了。

Unity Shader 景深效果

效果 原理: 开启摄像机的深度模式,将深度保存到一张名为_CameraDepthTexture(Unity5.0之后才有)内置的纹理中. 如果深度在焦点范围内就用原图,否则就用模糊图。 Shader: Shader "DepthOfFiled" { Properties { _MainTex ("Texture", 2D)...

weixin_30699741的博客 364

Multisim电路仿真与实验:包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路:竞争冒险、数字锁

这些实际系统可以是电的或非电的物理量系统,也可以是经济、军事等非物理量系统。矩形周期信号的幅度和周期保持不变,随着占空比的增加(即脉宽加大),主峰高度越高,主峰宽度越窄,各谱线间隔越窄,主峰包含的谱线数量越少,有效频带宽度越窄,主峰内高次谐波分量越少。输入信号所经路径不同而引起的冒险现象,按短暂尖峰极性的不同,可将冒险分为“0-1-0”型险象(也称“1”型)和“1-0-1”型险象(也称“0”型)理想的正弦波的幅度谱包含1条谱线,证明其只有基频分量,而无谐波分量,如果能测出谐波分量,说明该正弦波已有失真。

Jumpingtigger_35的博客 1万+

Unity Shader 屏幕后效果——景深

景深效果的原理是,在摄像机的近裁剪平面和远裁剪平面之间可以设置一个焦距,在这个距离所在的平面上的物体最为清晰,而这个距离之前或之后的物体成像是一种模糊状态(根据距离逐渐模糊,最终达到最为模糊的状态)。 在shader中,需要一张清晰的场景图和一张模糊的场景图,可以通过每个像素相对焦距的距离来判定这个像素最终的清晰程度。在清晰图和模糊图之间做关于深度变化的插值运算。 关于摄像机...

weixin_38168696的博客 733

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8764

Unity URP RenderFeature 自定义后效

using System; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class ArtsEffectFeature : ScriptableRendererFeature { //属性暴露在RenderFeature界面 public static bool GlobalActive = false; [Serializable] p

enk_2的博客 4289

告别繁琐!VS Code 下OpenClaw零配置上手秘籍

本文介绍了在VSCode环境下零配置上手OpenClaw开发工具的最佳实践。首先详细说明了VSCode和OpenClaw插件的安装步骤,包括获取安装包、配置环境变量等准备工作。然后重点讲解了核心配置流程:设置OpenClaw路径、调整工作区参数、添加自定义代码片段等优化开发体验的方法。通过创建测试项目验证配置有效性,并针对常见的路径错误、运行报错等问题提供了排查方案。本文旨在帮助开发者快速搭建高效的OpenClaw开发环境,充分发挥VSCode与OpenClaw的组合优势,提升开发效率。无论是新手还是资深开

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 528

Unity Shader PostProcessing - 7 - DepthOfField(DOF)景深

基本概念 在百度百科里有解析:景深。 引用其简短描述的一段话: 景深(DOF),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。 在聚焦完成后,焦点前后的范围内所呈现的清晰图像的距离,这一前一后的范围,便叫做景深。 在镜头前方(焦点的前、后)有一段一定长度的空间,当被摄物体位于这段空间内时,其在底片上的成...

Jave.Lin 的学习笔记 3833

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 425

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1032
上一篇: Shader Graph:可视化编程在 URP/HDRP 中的应用
下一篇: Unity URP 体积光与雾效 基于深度重建世界空间位置,实现体积雾与体积光
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值