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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值