我正在尝试创建一个带有bump-mapping的着色器。
我有对象的真实法线,我有bump-map的采样法线。我想做的是旋转采样法线,使采样法线的"向上"点指向实法线的方向。
我一直在做数学,但我似乎做不对……你在这个世界上很成功。
// 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);
当你想使用法线映射时(这就是你实际上所说的"凹凸映射"),你需要两个额外的向量来做你想做的:正切和双法线。切线和双法线是从"凹凸贴图"的几何法线和纹理空间中计算出来的。
我确实解释了如何做到这一点→我对StackOverflow问题的回答"如何计算正切和二法线?"
法线、正切线和二法线形成一个坐标系,可表示为3×3矩阵。这个矩阵实际上是将法线贴图转换为模型局部空间所需的旋转矩阵,这样你就可以使用它进行照明计算。简而言之,你乘以由这三个向量组成的三脚架矩阵。