0.简介
前面我们实现的镜面反射都是统一的反射指数,但是对于有些材质就不适合有太强的反光效果,通过镜面反射纹理来实现不同部位的反射效果不同
1.添加纹理
这里和纹理的使用差不多,将原来的参数替换成图片,这里的图片应该是一张灰度图如下图。
这个是木箱子的反射贴图,黑色的部分是不发生镜面反光的,白色部分是有镜面反光的。
float HighMaterial::getSpecular(vec2 uv)
{
if (speculars.cols <= 0)
return specular;
int j = abs((int(uv.x * speculars.cols)) % speculars.cols);
int i = abs((int(uv.y * speculars.rows)) % speculars.rows);
return speculars.at<uchar>(i, j)*1.0/255.0;
}
采样函数中变成如下代码
Ray Polygon::sample(Ray out, Ray reflect, Ray refract)
{
Ray res(out.direction, out.position, 0, vec3(0, 0, 0), out.polygon);
//out光线带的是对应物体的法向量值
float cosa = abs(dot(out.normal,-out.direction));//光线入射角和面法向量的cos值
//发光计算
res.color = m->getColor(out.end.textureUV) * m->light * std::fmaxf(cosa,0);
//反射颜色计算
if(reflect.polygon)
res.color += reflect.color * m->getSpecular(out.end.textureUV);
if (refract.polygon)
res.color += refract.color + m->transparent;
return res;
}
2.效果
不加这个纹理的时候效果是如下。
看到箱子底部全部反光,地面油油的效果。
加上这个新的贴图后。
箱子不是全部反光了,只有边上金属边框有反光效果。
地面也加上反射贴图。
加上后看起来地面不再是油油的了。