自言自语
视差贴图就是对贴图的UV采样进行特殊处理。采样的UV 经过切线空间下的 viewDirection 的偏移计算得到一个视觉上的偏差感受。看起来像有深度一样。原理和推导公式 https://learnopengl-cn.github.io/05%20Advanced%20Lighting/05%20Parallax%20Mapping/ 这个链接里写的很清楚。我呢就看了个大概。然后就用用吧。
一、效果如上链接的展示
二、Shader关键代码记录
//首先需要有转换到切线空间的 TBN 矩阵
float3x3 TBN (float3 TangentWS,float3 BinormalWS,float3 NormalWS)
{
float3 T = normalize(TangentWS.xyz);
float3 B = normalize(BinormalWS.xyz);
float3 N = normalize(NormalWS.xyz);
float3x3 TBN = float3x3(T,B,N);
return TBN;
}
float height = tex2D(_HeightMap,i.uv).r;
float2 ParallaxMapping(float3x3 TBN,float4 viewDir,float2 sourceUV,float height,float parallaxScale,int loop)
{
float3 tangentViewDir = mul(TBN,viewDir.xyz);
float2 parallaxUV = tangentViewDir.xy/tangentViewDir.z;
//height 为深度图 float类型,也可以用单一float数值代替
//为更加准确 可以用 for循环来叠加采样。 但考虑到性能一般只要做两三次。 同时采取一些手段 比如0.5分界线高度图 来达到上下各异的视差
float2 destUV = sourceUV;
for (int j= 0 ; j<loop;j++)
{
destUV += height*parallaxUV*parallaxScale; //这里的parallaxUV 不要做UV缩放,因为他毕竟不是真实采样UV 只是用来进行偏移计算的.记录于2023年各种项目实践验证后的纠错.
}
return destUV;
}
//最后用destUV进行采样需要视差的贴图即可
总结
原理一知半解。但基本会用了。 后边再认真读一下 OPENGL的论文。加深理解 免得忘记。 之前做过视差,就是忘记了 所以再此记录一笔。