【RayTracingInOneWeekend】表面法线着色

要考虑两个问题,首先是要求使这些法线单位化,方便着色。第二个就是要考虑到光线击中球的具体的位置的值,而不仅仅是考虑我们是否命中。
在原有基础上,修改Hit_Sphere()函数:

float Hit_Sphere(const point3& center, float radius, const ray& r)
{
	auto lightSourceToSphereCenter = r.origin() - center;
	auto a = dot(r.direction(), r.direction());
	auto b = 2 * dot(r.direction(), lightSourceToSphereCenter);
	auto c = dot(lightSourceToSphereCenter,lightSourceToSphereCenter) - radius * radius;

	auto rootFunction = b * b - 4 * a * c;
	if (rootFunction < 0) return -1;
	
	else
		return(-b - sqrt(rootFunction)) / (2.f * a);//求出具体的值
}

修改ray_color()函数

color ray_color(const ray& r)
{
	auto t = Hit_Sphere(point3(0, 0, -1), 0.5, r);
	if (t > 0.f)
	{
		auto N = unit_vector(r.at(t) - vec3(0, 0, -1));
		return 0.5f * color(N.x() + 1, N.y() + 1, N.z() + 1);//将[-1,1]范围内的值映射到[0,1]范围内。
		//在这里,通过将向量N的每个分量都加1,将其映射到了[0,2]范围内,然后再将其除以2,就得到了[0,1]范围内的值,
		//这样就可以作为颜色分量的取值了
	}

	vec3 unit_direction = unit_vector(r.direction());
	t = 0.5f * (unit_direction.y() + 1.0f);
	//(1−t)×c1 + t×c2 线性插值

	return (1.f - t) * color(1.f, 1.f, 1.f) + t * color(0.5f, 0.7f, 1.f);
}

可以得到如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值