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

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

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

      【URP】Unity[視差遮擋貼圖]原理剖析實踐

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

      視差遮擋貼圖(Parallax Occlusion Mapping, POM)介紹

      視差遮擋貼圖是視差貼圖技術的高階實現,通過?光線步進(Raymarching)算法?精確計算視線與高度圖的交點,模擬復雜表面(如磚墻、巖石)的幾何遮擋效果。相比標準視差貼圖,POM能更真實地表現深度變化和自陰影,適用于高精度材質表現。

      核心原理

      • ?分層深度檢測?將視線方向在切線空間分解為多層(通常8-15層),逐層采樣高度圖,通過二分法逼*視線與表面的交點。
      • ?動態采樣優化?根據視角與法線的夾角動態調整采樣層數(**行視角增加層數,垂直視角減少層數),*衡精度與性能。
      • ?遮擋關系重建?通過交點處的UV偏移修正紋理采樣位置,模擬凹凸表面的光線遮擋效果。

      Unity URP 實現示例與原理詳解

      代碼關鍵點解析

      • ?動態采樣層數?

        • 通過lerp(_MaxSamples, _MinSamples, saturate(dot(float3(0,0,1), viewDirTS)))實現視角自適應分層,優化性能。
      • ?光線步進循環?

        • 循環比較當前層高度與采樣深度,找到首個交點區間,避免全精度遍歷。
      • ?二分法優化?

        • 在初步交點區間內使用lerp插值計算精確UV,減少采樣次數。
      • ParallaxOcclusionMapping.shader

        Shader "Universal Render Pipeline/POM"
        {
            Properties
            {
                _MainTex("Albedo", 2D) = "white" {}
                _NormalMap("Normal Map", 2D) = "bump" {}
                _HeightMap("Height Map", 2D) = "white" {}
                _ParallaxScale("Height Scale", Range(0, 0.1)) = 0.05
                _MinSamples("Min Samples", Int) = 8
                _MaxSamples("Max Samples", Int) = 15
            }
        
            SubShader
            {
                Tags { "RenderPipeline"="UniversalPipeline" }
        
                HLSLINCLUDE
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
        
                TEXTURE2D(_MainTex);    SAMPLER(sampler_MainTex);
                TEXTURE2D(_NormalMap);  SAMPLER(sampler_NormalMap);
                TEXTURE2D(_HeightMap);  SAMPLER(sampler_HeightMap);
                float _ParallaxScale;
                int _MinSamples, _MaxSamples;
        
                float2 ParallaxOcclusionMapping(float3 viewDirTS, float2 uv)
                {
                    // 動態計算采樣層數
                    int numSamples = (int)lerp(_MaxSamples, _MinSamples, saturate(dot(float3(0,0,1), viewDirTS)));
                    float layerHeight = 1.0 / numSamples;
                    float2 deltaUV = _ParallaxScale * viewDirTS.xy / viewDirTS.z / numSamples;
        
                    // 光線步進初始化
                    float currentLayerHeight = 0;
                    float2 currentUV = uv;
                    float currentDepth = 1 - SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, currentUV).r;
        
                    // 分層檢測
                    [loop]
                    for (int i = 0; i < 15; ++i) {
                        if (currentLayerHeight >= currentDepth) break;
                        currentUV -= deltaUV;
                        currentDepth = 1 - SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, currentUV).r;
                        currentLayerHeight += layerHeight;
                    }
        
                    // 二分法精確交點
                    float2 prevUV = currentUV + deltaUV;
                    float prevDepth = currentDepth - layerHeight;
                    float weight = (currentLayerHeight - currentDepth) / (prevDepth - currentDepth);
                    return lerp(currentUV, prevUV, weight);
                }
                ENDHLSL
        
                Pass
                {
                    HLSLPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
        
                    struct Attributes
                    {
                        float4 positionOS : POSITION;
                        float2 uv : TEXCOORD0;
                        float3 normalOS : NORMAL;
                        float4 tangentOS : TANGENT;
                    };
        
                    struct Varyings
                    {
                        float4 positionCS : SV_POSITION;
                        float2 uv : TEXCOORD0;
                        float3 viewDirTS : TEXCOORD1;
                    };
        
                    Varyings vert(Attributes IN)
                    {
                        Varyings OUT;
                        VertexPositionInputs posInput = GetVertexPositionInputs(IN.positionOS.xyz);
                        OUT.positionCS = posInput.positionCS;
        
                        // 轉換視角方向到切線空間
                        VertexNormalInputs normInput = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);
                        float3 viewDirWS = GetWorldSpaceViewDir(posInput.positionWS);
                        OUT.viewDirTS = TransformWorldToTangent(viewDirWS, 
                            normInput.tangentWS, normInput.bitangentWS, normInput.normalWS);
        
                        OUT.uv = IN.uv;
                        return OUT;
                    }
        
                    half4 frag(Varyings IN) : SV_Target
                    {
                        // 計算POM偏移后的UV
                        float2 pomUV = ParallaxOcclusionMapping(normalize(IN.viewDirTS), IN.uv);
        
                        // 采樣最終紋理
                        half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, pomUV);
                        half3 normalTS = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, pomUV));
        
                        return half4(albedo.rgb, 1);
                    }
                    ENDHLSL
                }
            }
        }
        

      技術對比與性能建議

      特性 標準視差貼圖 陡峭視差貼圖 POM
      ?采樣次數? 單次 5-15次 8-15次+二分法
      ?陡峭表面精度?
      ?適用*臺? 移動端 PC/主機 高端PC
      ?推薦參數? Scale=0.02 Scale=0.05 Scale=0.03-0.07

      實際應用中需注意:

      • 高度圖建議使用法線貼圖的Alpha通道節省資源
      • 過高的_ParallaxScale可能導致邊緣拉伸,建議不超過0.1
      • 移動端可減少_MaxSamples至8層以降低開銷

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

      posted @ 2025-10-24 14:57  SmalBox  閱讀(76)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 丰满爆乳一区二区三区| 亚洲一区二区三区18禁| 国产普通话刺激视频在线播放| 亚洲日本乱码在线观看| 激情伊人五月天久久综合| 亚洲一区二区三区激情在线| 野花在线观看免费观看高清| 国产中文字幕精品在线| 亚洲AV成人片在线观看| 日日噜噜夜夜狠狠视频| 新蔡县| 亚洲一区二区三区黄色片| 欧美大胆老熟妇乱子伦视频 | 国产精品久久久久影院亚瑟| 日韩有码国产精品一区| 亚洲天堂精品一区二区| 日本中文字幕乱码免费| 亚洲av成人无码天堂| 亚洲男同志网站| 亚洲av激情一区二区三区| 免费午夜无码片在线观看影院| 老湿机69福利区无码| 91精品亚洲一区二区三区| 四虎女优在线视频免费看| 久久精品国产高潮国产夫妻 | 自拍视频亚洲精品在线| 色偷偷久久一区二区三区| 久热这里只有精品12| 精品人妻大屁股白浆无码| av无码久久久久不卡网站蜜桃| 久久99精品久久久久久9| 国产成人精品日本亚洲| 亚洲欧美国产精品久久久久久久| 精品人妻二区中文字幕| 国产精品成人久久电影| 东京热一区二区三区在线| 日本午夜精品一区二区三区电影 | 巴中市| 亚洲精品综合久久国产二区| 亚洲国产日韩一区三区| 莱芜市|