如何组合凹凸贴图法线和真实法线?

时间:2013-04-06 23:13:54

标签: shader hlsl bump-mapping

我正在尝试使用凹凸贴图创建着色器。

我有对象的真实法线,并且我对凹凸贴图采样正常。 我想做的是旋转采样法线,使采样法线点“向上”朝向真实法线方向。

我一直在数学上工作,我似乎无法做到正确...... Y在这个世界上升。

// Vertex shader sends this matrix to the pixel shader
OUT.normal[0] = mul((float3x3)world, normal);
float3 temptan = cross(normal, float3(0, 0, 1));
temptan = normalize(temptan);
OUT.normal[2] = mul((float3x3)world, temptan);
OUT.normal[1] = cross(OUT.normal[0], OUT.normal[2]); calculating binormal (in world space)

// Pixel Shader:
// Get normal from bump texture
float3 normal = tex2D(normalmap, texCoord);
normal = normal * 2 - 1;
// Swap Z and Y, since Z is up on the texture, but Y is up in this world.
float temp = normal[1];
normal[1] = -normal[2];
normal[2] = temp;
// Multiply the sampled normal and the normal-basis matrix together.
normal = mul(normalMat, normal);

1 个答案:

答案 0 :(得分:5)

如果您想使用法线贴图(这就是“凹凸贴图”的实际含义),您需要为要执行的操作添加两个附加矢量:切线 binormal 。根据几何法线和“凹凸贴图”的纹理空间计算切线和副法线。

我确实在→my answer to StackOverflow question "How to calculate Tangent and Binormal?"

中解释了如何执行此操作

正常,切线和副法形成坐标系,可表示为3×3矩阵。此矩阵实际上是将法线贴图转换为模型局部空间所需的旋转矩阵,因此您可以将其用于照明计算。简而言之,你用这三个向量的三脚架形成的矩阵相乘。