首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RayTracing、Phong模型/镜面照明不工作?

RayTracing、Phong模型/镜面照明不工作?
EN

Stack Overflow用户
提问于 2020-02-21 16:04:46
回答 1查看 203关注 0票数 1

我一直试图使用Phong模型生成一个有光泽的阴影,但由于某种原因,我得到的只是球体正面的大白斑。最初,模型适用于单个球体,但现在我更新了代码,以便可以绘制多个球体,尽管应用了相同的逻辑,但模型开始失败,我不知道为什么。

单个球体:漫反射和镜面反射

漫反射,多个

diffuse+specular,多个

主体部分

代码语言:javascript
复制
vec color(const ray& r)
{
    vector <sphere> objects;
    vector <Light> lighting;

    objects.push_back(sphere(vec(0,-100.5,-3), 100, vec(0, 1, 0)));
    objects.push_back(sphere(vec(0, 0, -1), 0.5, vec(1, 0, 0)));
    objects.push_back(sphere(vec(0, 1 ,-1), 0.5, vec(1, 0, 1)));
    lighting.push_back(Light(vec(0, 0, -1), vec(0, -1, 0)));

    float infinity = 2000.0;
    sphere* closest = NULL;
    vec background_color( .678, .847, .902);
    vec totalLight(0.0, 0.0, 0.0);
    int pos = 0;
    for(int j = 0; j < objects.size(); j++)
    {
        float t = objects[j].intersect(r);
        if(t > 0.0)
        {
            if(t < 2000.0)
            {
                infinity = t;
                closest = &objects[j];
                pos = j;
            }
        }
    }
    if(infinity == 2000.0)
        return background_color;
    else
    {
        float a = objects[pos].intersect(r);
        vec view_dir = vec(-2, 2, 10) - r.p_at_par(a);
        vec normal = unit_vector((r.p_at_par(a) - closest->centre)/closest->radius);
        vec light = unit_vector(vec(-2, 0, 0) - r.p_at_par(a));
        vec reflection = 2.0*dot(light, normal)*normal - light;
        vec specular = vec(1, 1, 1)*pow(max(0.f, dot(reflection, view_dir)), 256);
        vec diffuse = (closest->color)*max(0.f, dot(normal, light));
        vec total = diffuse + specular;
        return total;

    }
}

据我所知,镜面反射=白色*点(view_dir,L_dir)^n * ks,总照明=镜面反射+漫反射+环境光。

EN

回答 1

Stack Overflow用户

发布于 2020-03-15 21:56:41

你确实对你的镜面贡献是正确的。你可以看到有多少光反射到我的观察方向。

首先,我不认为你会让view_dir正常化。确保所有的向量都是标准化的。如果a和b的长度为1,则下一个为真

另外,为了便于以后的调试,您可能希望生成假彩色图像。这些图像可以帮助你了解正在发生的事情。例如,您可以只渲染平面颜色、曲面法线(xyz到rgb)、影响某个像素的光源数量等。这可能会帮助你发现意外的行为。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60334440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档