赞
踩
以下代码摘抄至SpaceTransform.hlsl,举例如下:
real3 TransformTangentToWorld(float3 normalTS, real3x3 tangentToWorld, bool doNormalize = false)
{
// Note matrix is in row major convention with left multiplication as it is build on the fly
real3 result = mul(normalTS, tangentToWorld);
if (doNormalize)
return SafeNormalize(result);
return result;
}
float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent, WorldBiTangent, WorldNormal));
自定义的half3x3 是行优先的,也就是第一行是切线,第二行是副切线,第三行是法线,但我们需要列矩阵。就是需要转置矩阵,转置矩阵等于逆矩阵,这里最简单的实现方法就是左乘变右乘。而unity内置的矩阵是列矩阵,可以直接左乘,如下:
float3 TransformObjectToWorld(float3 positionOS)
{
#if defined(SHADER_STAGE_RAY_TRACING)
return mul(ObjectToWorld3x4(), float4(positionOS, 1.0)).xyz;
#else
return mul(GetObjectToWorldMatrix(), float4(positionOS, 1.0)).xyz;
#endif
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。