首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PathTracing ShadowRay的问题,球体全部为黑色

PathTracing ShadowRay的问题,球体全部为黑色
EN

Stack Overflow用户
提问于 2019-07-12 22:52:56
回答 1查看 117关注 0票数 2

所以我在OpenGL中制作了一个光线跟踪器,完全基于着色器,我正在努力找出阴影光线的问题所在。如果我将物体的亮度乘以shadowRay输出,似乎只有球体的“边缘”变亮了。

我多次验证了代码,但没有找到问题的来源。

这是我得到的:

代码语言:javascript
复制
vec3 TraceShadowRay(vec3 hitPoint, vec3 normal, Object objects[3])
{
    Light pointLight;

    pointLight.position = vec3(0, 80, 0);
    pointLight.intensity = 2;

    Ray ShadowRay;
    ShadowRay.origin = hitPoint + normal * 1e-4;
    ShadowRay.dir = normalize(pointLight.position - ShadowRay.origin);
    ShadowRay.t = 100000;
    //ShadowRay.dir = vec3(0, 1, 0);

    for(int i = 0; i < 3; ++i)
    {
        if(objects[i].type == 0)
        {
            if(interectSphere(objects[i].position, objects[i].radius, ShadowRay))
            {
                return vec3(0);
            }
        }
        if(objects[i].type == 1)
        {
            if(intersectPlane(objects[i].normal, objects[i].position, ShadowRay))
            {
                return vec3(0);
            }
        }
    }
    float AngleNormalShadow = dot(ShadowRay.dir, normal);
    clamp(AngleNormalShadow, 0, 1);

    return GetLight(ShadowRay.origin, pointLight);// * AngleNormalShadow;
}

getLight函数:

代码语言:javascript
复制
vec3 GetLight(vec3 origin, Light light)
{
    return vec3(1, 1, 1) * light.intensity;
    //float dist = sqrt( ((origin.x - light.position.x) * (origin.x - light.position.x))  +   ((origin.y - light.position.y) * (origin.y - light.position.y)));
    //return (vec3(1, 1, 1) * light.intensity) / (4 * M_PI * ((origin - light.position).length * (origin - light.position).length));
}

intersectSphere函数:

代码语言:javascript
复制
bool interectSphere(const vec3 center, float radius, inout Ray r)
{
    vec3 o = r.origin;
    vec3 d = r.dir;

    vec3 v = o - center;

    float b = 2 * dot(v, d);
    float c = dot(v, v) - radius*radius;
    float delta = b*b - 4 * c;

    if(delta < 1e-4)
        return false;

    float t1 = (-b - sqrt(delta))/2;
    float t2 = (-b + sqrt(delta))/2;

    if(t1 < t2)
    {
        r.t = t1;
        r.t2 = t2;
    }
    else if(t2 < t1)
    {
        r.t = t2;
        r.t2 = t1;
    }

    r.reflectionNormal = normalize((r.origin + r.dir * r.t) - center);

    return true;
}

预期的结果是一个很好的阴影球体,光线来自球体的顶部。

EN

回答 1

Stack Overflow用户

发布于 2019-07-15 09:56:26

会不会是一个缺失的否定呢?当发生冲突时,看起来interectSphere()返回true,但TraceShadowRay()中的调用代码在返回true时退出。

旧的:

代码语言:javascript
复制
        if(interectSphere(objects[i].position, objects[i].radius, ShadowRay))
        {
            return vec3(0);
        }

新的:

代码语言:javascript
复制
        if(!interectSphere(objects[i].position, objects[i].radius, ShadowRay))
        {
            return vec3(0);
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57009441

复制
相关文章

相似问题

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