2025/12/26 20:12:29
网站建设
项目流程
手机微信网站怎么做的,wordpress 数字不连续,iis8搭建网站,淘宝优惠券微网站开发视差遮挡贴图#xff08;Parallax Occlusion Mapping, POM#xff09;介绍视差遮挡贴图是视差贴图技术的高阶实现#xff0c;通过光线步进#xff08;Raymarching#xff09;算法精确计算视线与高度图的交点#xff0c;模拟复杂表面#xff08;如砖墙、岩石#xf…视差遮挡贴图Parallax Occlusion Mapping, POM介绍视差遮挡贴图是视差贴图技术的高阶实现通过光线步进Raymarching算法精确计算视线与高度图的交点模拟复杂表面如砖墙、岩石的几何遮挡效果。相比标准视差贴图POM能更真实地表现深度变化和自阴影适用于高精度材质表现。核心原理分层深度检测将视线方向在切线空间分解为多层通常8-15层逐层采样高度图通过二分法逼*视线与表面的交点。动态采样优化根据视角与法线的夹角动态调整采样层数**行视角增加层数垂直视角减少层数*衡精度与性能。遮挡关系重建通过交点处的UV偏移修正纹理采样位置模拟凹凸表面的光线遮挡效果。Unity URP 实现示例与原理详解代码关键点解析动态采样层数通过lerp(_MaxSamples, _MinSamples, saturate(dot(float3(0,0,1), viewDirTS)))实现视角自适应分层优化性能。光线步进循环循环比较当前层高度与采样深度找到首个交点区间避免全精度遍历。二分法优化在初步交点区间内使用lerp插值计算精确UV减少采样次数。ParallaxOcclusionMapping.shaderShader 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 { RenderPipelineUniversalPipeline }HLSLINCLUDE#include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlslTEXTURE2D(_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);}ENDHLSLPass{HLSLPROGRAM#pragma vertex vert#pragma fragment fragstruct 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偏移后的UVfloat2 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推荐参数 Scale0.02 Scale0.05 Scale0.03-0.07实际应用中需注意高度图建议使用法线贴图的Alpha通道节省资源过高的_ParallaxScale可能导致边缘拉伸建议不超过0.1移动端可减少_MaxSamples至8层以降低开销