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.效果
不加這個紋理的時候效果是如下。
看到箱子底部全部反光,地面油油的效果。
加上這個新的貼圖後。
箱子不是全部反光了,只有邊上金屬邊框有反光效果。
地面也加上反射貼圖。
加上後看起來地面不再是油油的了。