34 lines
2.0 KiB
HLSL
34 lines
2.0 KiB
HLSL
// SPDX-License-Identifier: (Not available for this version, you are only allowed to use this software if you have express permission from the copyright holder and agreed to the latest NiloToonURP EULA)
|
|
// Copyright (c) 2021 Kuroneko ShaderLab Limited
|
|
|
|
// For more information, visit -> https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample
|
|
|
|
// #pragma once is a safe guard best practice in almost every .hlsl,
|
|
// doing this can make sure your .hlsl's user can include this .hlsl anywhere anytime without producing any multi include conflict
|
|
#pragma once
|
|
|
|
// here TS = Tangent space, not TargetSpace
|
|
float3 ConvertNormalTSToNormalTargetSpace(float3 normalTS, float3 tangentTargetSpace, float3 bitangentTargetSpace, float3 normalTargetSpace)
|
|
{
|
|
// TBN matrix, usually when you need to convert tangent space normal to other space(target space), you will need a TBN matrix of that target space
|
|
float3x3 TBNMatrixTargetSpace = float3x3(tangentTargetSpace, bitangentTargetSpace, normalTargetSpace);
|
|
|
|
// Usually 99% of the time you will see hlsl's mul() in this order
|
|
// resultVector = mul(matrix, vector);
|
|
|
|
// However doing the multiplication of the matrix and the vector in a different order; the matrix is transposed.
|
|
// mul(matrix, vector) == mul(vector, transpose(matrix))
|
|
// mul(transpose(matrix), vector) == mul(vector, matrix)
|
|
|
|
// for more information about it you can read: https://forum.unity.com/threads/mul-function-and-matrices.445266/#post-2880535
|
|
|
|
// 1.TBNMatrixTargetSpace is a rotation only 3x3 matrix
|
|
// 2.The inverse of a rotation only matrix is its transpose, which is also a rotation only matrix
|
|
// (https://en.wikipedia.org/wiki/Rotation_matrix)
|
|
// 3.mul(A,B) is the transpose of mul(B,A)
|
|
float3 resultNormalTargetSpace = mul(normalTS, TBNMatrixTargetSpace); // so this line means transform from Tangent space back to "Target space", it only works for "rotation-only" matrix
|
|
|
|
return resultNormalTargetSpace;
|
|
}
|
|
|