视差贴图Parallax Mapping —— UnityShader学习记笔记


自言自语

视差贴图就是对贴图的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的论文。加深理解 免得忘记。 之前做过视差,就是忘记了 所以再此记录一笔。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值