介绍UE4 Landscape通过Normal计算TangentToLocal矩阵 | 您所在的位置:网站首页 › ue4 gps › 介绍UE4 Landscape通过Normal计算TangentToLocal矩阵 |
VertexFactoryGetPerPixelTangentBasis
先看下计算Tangent到Local空间的Shader代码 float3x3 VertexFactoryGetPerPixelTangentBasis(FVertexFactoryInterpolantsVSToPS Interpolants) { float3x3 Result; #if PIXELSHADER || RAYHITGROUPSHADER || COMPUTESHADER #if FEATURE_LEVEL >= FEATURE_LEVEL_SM4 float4 SampleValue = Texture2DSample(LandscapeParameters.NormalmapTexture, LandscapeParameters.NormalmapTextureSampler, Interpolants.WeightHeightMapTexCoord.zw); #else float4 SampleValue = Texture2DSample(LandscapeParameters.NormalmapTexture, LandscapeParameters.NormalmapTextureSampler, Interpolants.WeightMapTexCoord); #endif #if WEBGL float2 SampleNormal = float2(SampleValue.b, SampleValue.a) * float2(2.0,2.0) - float2(1.0,1.0); #else float2 SampleNormal = float2(SampleValue.b, SampleValue.a) * float2(2.0,2.0) - float2(1.0,1.0); #endif float3 WorldNormal = float3( SampleNormal, sqrt(max(1.0-dot(SampleNormal,SampleNormal),0.0)) ); Result = CalcTangentBasisFromWorldNormal(WorldNormal); #endif return Result; }先从贴图里将Landscape的Normal Texture里Sample出来,NormalTexture像素和Landscape每个Vertex是对应的。SamplerState使用了Bilinear过滤。 ............................................... if (NormalmapTexture) { LandscapeParams.NormalmapTexture = NormalmapTexture->TextureReference.TextureReferenceRHI; LandscapeParams.NormalmapTextureSampler = TStaticSamplerState::GetRHI(); } ...............................................WorldNormal这个变量名字是不准确的,这个实际是LocalNormal (局部空间的Normal,因为没有乘LocalToWorld矩阵) CalcTangentBasisFromWorldNormal先看下Shader代码 float3x3 CalcTangentBasisFromWorldNormal(float3 Normal) { float3 LocalTangentX = normalize(float3(Normal.z, 0, -Normal.x)); float3 LocalTangentY = cross(Normal, LocalTangentX); float3x3 LocalToTangent = float3x3(LocalTangentX,LocalTangentY,Normal); return LocalToTangent; }第一句代码 float3 LocalTangentX = normalize(float3(Normal.z, 0, -Normal.x));,这个怎么理解? 这个实际是先将Normal Vector投影到ZX平面,然后再围绕Y轴逆时针旋转了90度,最后正规化。 LocalTangentY通过Normal和LocalTangentX的叉积得到。 最后放入到3x3矩阵组成, Tangent到Local的变换矩阵(可以参考Change of basis in Linear Algebra, Unreal Engine用的是行矩阵,文章和书里一般用列矩阵) 。 这样计算出来的Tangent Basis坐标,Tangent和贴图U方向是对齐的,BiTangent和V方向是对齐的。 (切线空间(Tangent Space)完全解析 ) |
CopyRight 2018-2019 实验室设备网 版权所有 |