射线追踪:阴影射线输出问题

时间:2018-11-25 13:49:31

标签: 3d raytracing phong

Before this is tagged as a duplicate, I am having the exact same problem as the individual who asked this question.

不幸的是,它根本没有帮助的答案,因此希望可以引发更好的讨论。使用C ++,当前的任务是编写经典的光线跟踪器。我正在使用Phong阴影模型,并且能够准确地照亮场景,直到需要投射阴影光线为止。

仅供参考,这是到目前为止我没有尝试阴影的图片:

遵循传统的光线跟踪算法,在该算法中,我寻找与针孔相机最接近的对象,然后调用以下函数来计算最终的像素颜色:

glm::vec3 Scene::illuminate(Ray* primary, Surface* object, glm::vec3 hitPt)
{
    float red, green, blue;
    Material m = object->getMaterial();
    float p = m.phongCoef;
    glm::vec3 kD = m.diffuse;
    glm::vec3 kS = m.specular;
    glm::vec3 kA = m.ambient;
    float iA = m.ambienceIntensity;
    float i = lightSrc.lightIntensity;
    glm::vec3 n = object->getSurfaceNormalAt(hitPt); //normalized before return.
    glm::vec3 viewRay = primary->getDirection();   //normalized class member.

    glm::vec3 lightRay = glm::normalize((lightSrc.getOrigin()) - hitPt); //origin not normalized before here
    glm::vec3 h = glm::normalize(viewRay + lightRay);
    float nDotlightRay = glm::dot(n,lightRay);
    float nDoth = glm::dot(n, h);

    bool inShadow = false;
    Ray shadowRay;
    //hitPt = glm::normalize(hitPt);
    shadowRay.setOrigin(hitPt);
    shadowRay.setDirectionVector(lightRay);
    for (int k = 0; k < objects.size(); ++k) {
        if (objects.at(k)->intersect(shadowRay)) {
            //std::cout<<shadowRay.getDirection().x<<","<< shadowRay.getDirection().y <<","<<shadowRay.getDirection().z<<"\n";
            inShadow = true;
            break;}}

    //plug in to shading model
    if (inShadow)
    {
        red = kA.x*iA;
        green = kA.y*iA ;
        blue = kA.z*iA ;
    }
    else{
        red = kA.x*iA  +  kD.x*i*(fmax(0,nDotlightRay))  +  kS.x*i*(powf((fmax(0, nDoth)),p));
        green = kA.y*iA  +  kD.y*i*(fmax(0,nDotlightRay))  +  kS.y*i*(powf((fmax(0, nDoth)),p));
        blue = kA.z*iA  +  kD.z*i*(fmax(0,nDotlightRay))  +  kS.z*i*(powf((fmax(0, nDoth)),p));
    }

    glm::vec3 pixelColor = glm::vec3(red, green, blue);
    return pixelColor;
}

我试图使用描述性的变量/函数名称,以尽量减少代码附带的解释。 glm::vec3只是GLM数学库中的数据结构,其中包含3D向量,可以在该3D向量上执行矩阵/向量操作。

就像我上面链接的问题一样,这是尝试阴影后的场景。

此场景的光位置是在摄像机参考系中表示的(0、2.5,-7.75)(其原点为(0,0,0)并且面向负z方向)。对于另一个场景,光源位于(4,6,-1),因此输出甚至与我尝试渲染的另一个场景的问题不一致,如您所见here;它在场景顶部只有一条细灰线,其他地方没有阴影吗?我完全迷失了方向,仅在这个问题上就花费了大约10个小时。任何建议都很好。

请让我知道我是否还能提供其他信息,例如如何计算距离和hitPoint?我不知道我是否应该调查一下这些内容,因为阴影部分可以正常工作,或者你们认为它仍然会导致此问题吗?深度之类的问题不应该成为问题,因为直到阴影出现为止,对象看起来都是正确的?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:上面提到的特定阴影伪像是在我的相交计算中省略了射线原点的结果。最初,我没有打扰,因为我的相机参考系位于(0,0,0)。但是对于阴影光线,原点不是零向量,因此重复使用相同的相交测试函数会得出完全不正确的结果。确保使用归一化方向向量也是关键,否则输出将毫无意义,从而难以缩小可能的错误范围。

相关问题