【发布时间】:2015-12-18 16:30:19
【问题描述】:
我想为被高度图置换的顶点生成法线。我有相应的法线贴图,但是我看到的示例显示法线向量等于法线贴图上像素的 RGB 值。但这意味着所有法线向量都是正的,而某些向量应该具有负值。您将如何使用法线贴图计算这些?
谢谢!
【问题讨论】:
我想为被高度图置换的顶点生成法线。我有相应的法线贴图,但是我看到的示例显示法线向量等于法线贴图上像素的 RGB 值。但这意味着所有法线向量都是正的,而某些向量应该具有负值。您将如何使用法线贴图计算这些?
谢谢!
【问题讨论】:
您只需将范围转移到<-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,其中法线是通过 #1b 方法从 GLSL 中的此类纹理计算的:
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(然后法线贴图变为红色)
【讨论】: