tinyrenderer-切线空间法线贴图

法线贴图
法线贴图分两种,一种是模型空间中的,一种是切线空间中的
在这里插入图片描述
模型空间中的法线贴图的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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值