学习光线追踪(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

发布了68 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ARTELE/article/details/103996599