我想生成由高度图移位的顶点的法线。我有相应的法线贴图但是我见过的例子显示法线贴图等于法线贴图上像素的RGB值。但这意味着当一些向量应该具有负值时,所有法向量都是正的。你会如何使用法线贴图计算这些?
谢谢!
答案 0 :(得分:0)
您只需将范围移至<-1.0,+1.0>
所以
如果您有范围<0.0,1.0>
// a)
nx=(2.0*r)-1.0
ny=(2.0*g)-1.0
nz=(2.0*b)-1.0
或:
// b)
nx=2.0*(r-0.5)
ny=2.0*(g-0.5)
nz=2.0*(b-0.5)
如果每个频道有8位,则范围为<0,255>
nx=(float(r)/127.5)-1.0
ny=(float(g)/127.5)-1.0
nz=(float(b)/127.5)-1.0
如果您查看法线贴图图像,您会看到蓝色,因为从平面朝上的中性normal=(0,0,1)
编码为color=(r=0.5,g=0.5,b=1.0)
,如下所示:
还可以看一下:Normal mapping gone horribly wrong其中法术是通过 GLSL 中的#1b 方法从这样的纹理计算出来的:
const vec4 v05=vec4(0.5,0.5,0.5,0.5);
texture2D(txr_normal,pixel_txr.st)-v05)*2.0;
同样(r,g,b)
可以映射到(nz,ny,nx)
而不是(nx,ny,nz)
,在这种情况下只需交换r,b
(法线贴图就是红色代替)