您尝试做的是创建凹凸贴图。
http://www.gutgames.com/post/Normal-Map-Creation-Using-C.aspx
它假定法线始终指向特定方向(通常垂直于面部),然后根据 rgb 值对其进行偏移。有很多资源涵盖凹凸贴图,包括上面的链接。
如果您想简化事情,您可以将实际的正常值存储在新位图的 RGB 中(请注意,使用此方法会丢失精度)。
如果您的范围是 [-1...1],则:将 1 添加到您的结果并除以 2,然后乘以 255。
所以如果你有正常的 (0, 1, 0)
0 + 1 = 1 / 2 = 0.5 * 255 = 128 = 你的新 X 值
1 + 1 = 2 / 2 = 1 * 255 = 255 = 你的新 Y 值
0 + 1 = 1 / 2 = 0.5 * 255 = 128 = 你的新 Z 值
然后将 (128,255,128) 存储在位图中。
要将其返回到正确的值,您将反转该过程:
128 / 255 = 0.5 * 2 = 1 - 1 = 0 = 你的旧 X 值
255 / 255 = 1 * 2 = 2 - 1 = 1 = 你的旧 Y 值
128 / 255 = 0.5 * 2 = 1 - 1 = 0 = 你的旧 Z 值
精度很差,但效果很好。您还可以打包这些值,以便每个 X 和 Y 获得两个字节。因此,RGBA 值的 X = RG 和 Y = BA。然后你可以做一些魔术来拉出 Z 值以获得完整的法线。当您对法线进行归一化时,它的长度变为 1。所以 1 = sqrt(x*x + y*y + z*z)。从位图中读取 X 和 Y 时您知道它们,因此您可以求解 Z。大大提高了精度,也可以根据您的需要用于提高凹凸贴图的精度。