學習光線追蹤(18)---鏡面反射貼圖

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.效果

不加這個紋理的時候效果是如下。

反射效果

看到箱子底部全部反光,地面油油的效果。

加上這個新的貼圖後。

有選擇性的反射

箱子不是全部反光了,只有邊上金屬邊框有反光效果。

地面也加上反射貼圖。

反射紋理

加上後看起來地面不再是油油的了。

3.源碼

release0.14

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章