gpt4 book ai didi

c++ - 光线追踪/Phong 模型漫反射组件

转载 作者:行者123 更新时间:2023-11-30 04:54:09 27 4
gpt4 key购买 nike

所以我在使用 Phong 模型时遇到了问题,特别是漫反射分量以及使用正确的法 vector 和光 vector 的方向。这是一个学校项目,但我不在乎我是否没有完成它,只要有人能告诉我我做错了什么。我已经尝试了一些事情,我做的最好的事情就是让一半的大球体在错误的方向上进行遮蔽。最亮的强度位于半个圆圈的外边缘,当它向中心移动时会变暗,而实际上应该是相反的方向。当我看到看起来像在空心圆圈中着色的模型时,它看起来像在线条中对球体进行着色。

第二个球体的阴影可能很难看清。 Shaded spheres

相关结构:

struct Ray
{
vec3 origin; // origin of the ray
vec3 dir; // direction of the ray
};

struct Sphere
{
vec3 center;
float radius;
vec3 ka, kd, ks;
vec3 reflectivity;
float alpha;

Sphere(const vec3& ic=vec3(0.0f), const float& ir=0.0f, const vec3& ika=vec3(0.0f), const vec3& ikd=vec3(0.0f), const vec3& iks=vec3(0.0f), const float& ireflectivity=0.1f, const float& ialpha=1.0f):
center(ic), radius(ir), ka(ika), kd(ikd), ks(iks), reflectivity(ireflectivity), alpha(ialpha)
{}

bool intersect(const Ray& ray, float& t0, float& t1);
};

struct PointLight
{
vec3 location;
vec3 id, is;

PointLight(const vec3& iloc=vec3(0.0f), const vec3& iid=vec3(0.0f), const vec3& iis=vec3(0.0f)):
location(iloc), id(iid), is(iis)
{}

};

vec3 color;
vec3 amb = my_sphere.ka* my_ambient_light.ia; // I = ka * ia ambient component
int temp = my_point_lights.size() - 1;
color += amb;

vec3 diff;
for (int i = my_point_lights.size() - 1; i >= 0; i--) {
vec3 n = (ray.origin + ray.dir - my_sphere.center);
normalize(n);

vec3 L = (my_point_lights[temp].location - ray.origin);
normalize(L);

diff += my_sphere.kd * my_point_lights[temp].id * std::max(dot(n, L), 0.0f);
}
color += diff;

最佳答案

您基本上似乎想在着色器中做的是计算球体上给定点的漫反射着色。为此,您基本上需要两件事:首先,要着色的球体上那个点的表面法线,其次,光线落在要着色的点上的方向。现在,在您可以继续计算对象在给定点的着色之前,您通常需要知道要着色的特定点的实际位置。由于您没有真正提供任何解释,例如 ray.dir 之类的东西在您的代码中实际代表什么,我将不得不求助于猜测。我假设您正在做的是片段着色器中的某种光线跟踪。而且我必须假设 ray.dir 不仅仅是一些 vector ,指向在您感兴趣的点击中球体的射线的一般方向,但它实际上是 vector ,它将把你从射线的起点带到球体上的确切命中点。否则,您将缺少真正做任何事情的最基本信息,即您想要遮蔽的点的坐标。在这种情况下,您首先必须计算光线与球体的实际交点所在的位置。

现在,如果我们做出所有这些假设,并且我们进一步假设您拥有的所有这些 vector 实际上表示同一坐标系中的坐标,那么 ray.origin + ray.dir - my_sphere.center确实应该产生一个从球体中心指向您想要遮蔽的点的 vector 。并且该 vector 确实应该指向您要着色的点处球体的表面法线方向。但是,计算漫反射着色所需的第二个 vector 是指向光线落在要着色的点上的方向的 vector 。即,从点到阴影指向光源的 vector 。但是,my_point_lights[temp].location - ray.origin 似乎是一个从光线原点指向光源的 vector 。

除此之外,可能应该引起您注意的是,与您的印象相反,函数 normalize(x) 不会修改您传递的 vector 一个论点。它只是返回另一个 vector ,该 vector 是您提供给它的任何 vector 的规范化版本。所以,很可能,你真正想写的是

n = normalize(n);

L = normalize(L);

此外,您在 colordiff 中累积值,但您从未将这些 vector 初始化为任何东西。您可能打算将它们初始化为零……😉

关于c++ - 光线追踪/Phong 模型漫反射组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com