<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【URP】Unity[后處理]通道混合ChannelMixer

      【從UnityURP開始探索游戲渲染】專欄-直達(dá)

      ChannelMixer是Unity URP后處理系統(tǒng)中用于顏色通道混合的核心效果組件,主要用于調(diào)整RGB通道的混合比例以實(shí)現(xiàn)特定的色彩分級效果。其發(fā)展歷史可追溯至影視行業(yè)的傳統(tǒng)調(diào)色技術(shù),后被整合到Unity的Post Processing Stack中,并隨著URP的演進(jìn)成為Volume框架下的標(biāo)準(zhǔn)化模塊

      核心功能與參數(shù)

      ?通道混合原理?

      通過修改輸入顏色通道(Red/Green/Blue)對輸出通道的貢獻(xiàn)權(quán)重,實(shí)現(xiàn)如單色保留、色調(diào)偏移等效果。例如增加綠色通道對紅色輸出的影響會(huì)使綠色區(qū)域偏紅。

      ChannelMixer在Unity URP后處理中的底層原理基于顏色通道的線性代數(shù)變換,通過對RGB通道的權(quán)重矩陣運(yùn)算實(shí)現(xiàn)色彩重構(gòu).

      輸出通道 = (R × R權(quán)重) + (G × G權(quán)重) + (B × B權(quán)重) + 常數(shù)偏移

      該計(jì)算在片元著色器中逐像素執(zhí)行,通過矩陣乘法實(shí)現(xiàn)顏色空間轉(zhuǎn)換.

      數(shù)學(xué)原理分解

      • ?通道變換矩陣
        • 每個(gè)輸出通道由3×4變換矩陣控制(包含常數(shù)項(xiàng)),例如紅色輸出通道計(jì)算為:
        • $R_{out}=R_{in}\times M_{00}+G_{in}\times M_{01}+B_{in}\times M_{02}+M_{03}$
        • 其中M_03為常數(shù)偏移量。
      • ?亮度保持機(jī)制?
        • 當(dāng)啟用Preserve Luminosity時(shí),系統(tǒng)會(huì)自動(dòng)歸一化權(quán)重系數(shù),確保滿足:
        • $M_{00}+M_{01}+M_{02}=1.0$
        • 防止畫面過曝或欠曝

      URP實(shí)現(xiàn)示例 關(guān)鍵實(shí)現(xiàn)解析

      • ?矩陣運(yùn)算階段?

        片元著色器通過dot(col.rgb, _RedOut.xyz)實(shí)現(xiàn)向量點(diǎn)乘,等效于矩陣乘法。例如設(shè)置_RedOut=(0.5,0.3,0.2)時(shí),新紅色通道值為原RGB通道的50%+30%+20%混合。

      • ?動(dòng)態(tài)參數(shù)傳遞?

        URP通過Volume組件將參數(shù)打包為Vector4(xyz為RGB權(quán)重,w為常數(shù)偏移),每幀更新至Shader。例如電影級調(diào)色常用配置:

        csharp
        _RedOut = new Vector4(0.8f, 0.1f, 0.1f, 0);// 強(qiáng)化紅色主基調(diào)
        _GreenOut = new Vector4(0f, 1.2f, -0.2f, 0);// 增強(qiáng)綠色并抑制藍(lán)色
        
      • ?后處理管線集成?

        RendererFeature在BeforeRenderingPostProcessing事件點(diǎn)插入通道混合操作,通過雙次Blit避免直接修改源紋理。臨時(shí)渲染目標(biāo)_TempChannelMixerTexture確保混合過程可逆.

      • ChannelMixer.shader

        Shader "PostProcessing/ChannelMixer" {
        Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _RedOut ("Red Output", Vector) = (1,0,0,0)
        _GreenOut ("Green Output", Vector) = (0,1,0,0)
        _BlueOut ("Blue Output", Vector) = (0,0,1,0)
        }
        SubShader {
        HLSLPROGRAM
        #pragma only_renderers d3d11
        #pragma exclude_renderers gles
        #pragma target 5.0
        #pragma multi_compile_postprocess
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PostProcessing.hlsl"
        
            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);
            float4 _RedOut;
            float4 _GreenOut;
            float4 _BlueOut;
        
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
        
            v2f vert(appdata v) {
                v2f o;
                o.vertex = TransformWorldToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
        
            float4 frag(v2f i) : SV_Target {
                float4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
                float3 result;
                result.r = dot(col.rgb, _RedOut.xyz) + _RedOut.w;
                result.g = dot(col.rgb, _GreenOut.xyz) + _GreenOut.w;
                result.b = dot(col.rgb, _BlueOut.xyz) + _BlueOut.w;
                return float4(result, col.a);
            }
            ENDHLSL
        }
        }
        
      • ChannelMixerRendererFeature.cs

        using UnityEngine;
        using UnityEngine.Rendering;
        using UnityEngine.Rendering.Universal;
        
        public class ChannelMixerRendererFeature : ScriptableRendererFeature {
            class CustomRenderPass : ScriptableRenderPass {
                Material _material;
                RenderTargetHandle _tempTexture;
        
                public CustomRenderPass(Material material) {
                    _material = material;
                    _tempTexture.Init("_TempChannelMixerTexture");
                }
        
                public override void Execute(ScriptableRenderContext context, ref RenderingData data) {
                    CommandBuffer cmd = CommandBufferPool.Get("Channel Mixer");
                    RenderTextureDescriptor desc = data.cameraData.cameraTargetDescriptor;
        
                    cmd.GetTemporaryRT(_tempTexture.id, desc);
                    Blit(cmd, source: "_CameraColorTexture", dest: _tempTexture.id, _material);
                    Blit(cmd, source: _tempTexture.id, dest: "_CameraColorTexture");
        
                    cmd.ReleaseTemporaryRT(_tempTexture.id);
                    context.ExecuteCommandBuffer(cmd);
                    CommandBufferPool.Release(cmd);
                }
            }
        
            [System.Serializable]
            public class Settings {
                public Material material;
            }
        
            public Settings settings = new Settings();
            CustomRenderPass _scriptablePass;
        
            public override void Create() {
                _scriptablePass = new CustomRenderPass(settings.material);
                _scriptablePass.renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;
            }
        
            public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData data) {
                renderer.EnqueuePass(_scriptablePass);
            }
        }
        

      ?參數(shù)說明?

      • ?Output Channel?:選擇要調(diào)整的目標(biāo)通道(Red/Green/Blue)
      • ?Red/Green/Blue Contribution?:各輸入通道對當(dāng)前輸出通道的影響權(quán)重(范圍-2到2)
      • ?Preserve Luminosity?:保持整體亮度不變,避免過度曝光。

      實(shí)現(xiàn)流程示例

      ChannelMixerExample.cs

      using UnityEngine;
      using UnityEngine.Rendering;
      using UnityEngine.Rendering.Universal;
      
      public class ChannelMixerExample : VolumeComponent, IPostProcessComponent {
          public Vector3Parameter redOut = new(new Vector3(1, 0, 0));
          public Vector3Parameter greenOut = new(new Vector3(0, 1, 0)); 
          public Vector3Parameter blueOut = new(new Vector3(0, 0, 1));
      
          public bool IsActive() => true;
          public bool IsTileCompatible() => false;
      }
      

      ChannelMixerRenderPass.cs

      using UnityEngine;
      using UnityEngine.Rendering;
      using UnityEngine.Rendering.Universal;
      
      public class ChannelMixerRenderPass : ScriptableRenderPass {
          private Material _material;
          private ChannelMixerExample _volume;
      
          public override void Execute(ScriptableRenderContext context, ref RenderingData data) {
              _volume = VolumeManager.instance.stack.GetComponent<ChannelMixerExample>();
              if (_volume == null) return;
      
              var cmd = CommandBufferPool.Get("ChannelMixer");
              _material.SetVector("_RedOut", _volume.redOut.value);
              _material.SetVector("_GreenOut", _volume.greenOut.value);
              _material.SetVector("_BlueOut", _volume.blueOut.value);
              Blit(cmd, ref data, _material, 0);
              context.ExecuteCommandBuffer(cmd);
          }
      }
      

      實(shí)際應(yīng)用案例

      ?電影感調(diào)色?

      將藍(lán)色通道注入紅色輸出(如設(shè)置RedOut為(0.8, 0, 0.2)),可創(chuàng)造類似《黑客帝國》的青色陰影效果。

      ?風(fēng)格化渲染?

      通過反轉(zhuǎn)綠色通道貢獻(xiàn)(GreenOut設(shè)為(-0.5, 1, 0)),實(shí)現(xiàn)賽博朋克風(fēng)格的色彩偏移。

      ?黑白濾鏡?

      統(tǒng)一各通道權(quán)重(如RedOut=(0.3,0.6,0.1))可生成高質(zhì)量灰度圖像,比直接去飽和度更可控。

      膠片模擬?

      • 設(shè)置BlueOut=(0,0,0.9,0.1)使藍(lán)色通道輕微壓縮,模擬柯達(dá)膠片特性

      ?色盲輔助?

      • 將紅色通道注入綠色輸出(GreenOut=(0.5,0.5,0,0))提升紅綠色盲辨識(shí)度

      ?風(fēng)格化渲染?

      • 負(fù)值權(quán)重創(chuàng)造互補(bǔ)色效果,如RedOut=(1, -0.2, 0, 0)產(chǎn)生賽博朋克色調(diào)

      操作步驟

      • 在Volume中添加Channel Mixer效果
      • 調(diào)整目標(biāo)通道的RGB權(quán)重三角滑塊
      • 啟用Preserve Luminosity避免過曝

      該技術(shù)現(xiàn)已成為URP標(biāo)準(zhǔn)管線的一部分,通過Volume系統(tǒng)實(shí)現(xiàn)非破壞性調(diào)整,比傳統(tǒng)Shader方案更易集成到美術(shù)工作流中


      【從UnityURP開始探索游戲渲染】專欄-直達(dá)
      (歡迎點(diǎn)贊留言探討,更多人加入進(jìn)來能更加完善這個(gè)探索的過程,??)

      posted @ 2025-11-01 19:29  SmalBox  閱讀(48)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 无码av不卡免费播放| 精品一区二区三区四区色| 国产精品一国产精品亚洲| 中文一区二区视频| 亚洲男女羞羞无遮挡久久丫| 国产呦交精品免费视频| 国产免费福利网站| 国产精品视频一区二区三区无码 | 亚洲中文字幕国产精品| 国产成年码av片在线观看| 国内精品视频一区二区三区八戒 | 亚洲欧美在线一区中文字幕| 成人午夜福利视频后入| 成人自拍小视频在线观看| 诏安县| 久久精品国产一区二区三| 国产一区二区波多野结衣| 亚洲狠狠婷婷综合久久久久图片 | 国产亚洲真人做受在线观看| 国内精品视频区在线2021| 中文字幕亚洲综合久久| 国产99久久久国产精品~~牛| 亚洲成人av高清在线| 日本一区不卡高清更新二区| 国产SM重味一区二区三区| 久久日韩精品一区二区五区| 影音先锋大黄瓜视频| 国产91麻豆视频免费看| 国产亚洲一二三区精品| 国产福利社区一区二区| 97精品尹人久久大香线蕉| 少妇被黑人到高潮喷出白浆| 播放灌醉水嫩大学生国内精品| 日本久久99成人网站| 中文字幕无码免费久久99| 重口SM一区二区三区视频| 国产精品99区一区二区三| 日韩亚洲中文图片小说| 一本久道中文无码字幕av| 亚洲成人四虎在线播放| 色猫咪av在线网址|