法线贴图
法线贴图分两种,一种是模型空间中的,一种是切线空间中的

模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz,与顶点坐标处于一个空间,图片是五颜六色的。

切线空间中的法线贴图的rgb同样对应xyz,是切线空间里的坐标,切线空间里的z轴正向垂直与当前三角形便宜,x是当前三角形片元表面的一个切线,y是他们的叉积。
切线空间每个轴范围是-1到1.但图片本身0-255对应的是0-1.而多数法线都是都是(0,0,1)(即当前像素的法向量刚好就是当前片元的顶点法向量)转换到颜色空间就是(0.5,0.5,1)(法向量坐标可能为负,但颜色范围始终为正)。因此图片主要是蓝紫色
两个完全一样材质的物体,由于位置不同光照也会不同。如果用模型空间存储的法线贴图,是绝对法线,法向量会完全不同,无法使用同一张物体。而切线空间存储的法线贴图完全是基于物体自身的,是相对法线,多个物体可以复用(优点)。但再实际计算时,需要根据物体本身的缩放位移做相应的矩阵转换处理(缺点)
模型空间的法线贴图直接提取向量信息做为法线向量即可
Vec3f Model::getNormal(float x, float y) {
TGAColor n = normalTex_.get(x * normalTex_.get_width(), y * normalTex_.get_height());
Vec3f res;
for (int i = 0; i < 3; i++) {
res[i] = n.bgra[i] / 255.f * 2 - 1.f;
}
return res;
}
//....
struct normalTexShader :public IShader {
mat<2, 3, float> uv;
virtual Vec4f vertex(int iface, int vertIdx, Matrix mvp) {
Vec3f v = model->vert(model->face

最低0.47元/天 解锁文章
3069

被折叠的 条评论
为什么被折叠?



