【问题标题】:Calculating the diffuse r,g,bvalue of pixel on raytracer using Blinn-Phong使用 Blinn-Phong 计算光线追踪器上像素的漫反射 rgb 值
【发布时间】:2020-07-16 04:44:19
【问题描述】:

我正在尝试使用 Blinn-Phong 公式计算像素的 RGB 值。为此,我使用此功能:

Material getPixelColor(Ray ray, double min, int index, std::vector<Object*> Objects, std::vector<Object*> lightSources) {

    Vector intersectionPoint = ray.getOrigin() + ray.getDirection() * min;
    Vector n = Objects.at(index)->getNormalAt(intersectionPoint);
    Vector reflectiondirection = ray.getDirection() - n * Vector::dot(ray.getDirection(), n) * 2;
    Ray reflectionRay(intersectionPoint, reflectiondirection);

    // check if ray intersects any other object;
    double minimum = INFINITY;
    int count = 0, indx = -1;
    for (auto const& obj : Objects) {
        double distance = obj->Intersect(reflectionRay);
        if (minimum > distance) {
            minimum = distance;
            indx = count;
        }
        count++;
    }

    Material result(0,0,0);
    if (recurseDepth >= 5 || indx == -1) {
        recurseDepth = 0;
        // Check if object is lit for each light source
        for (auto const& light : lightSources) {
            // Blinn-Phong
            Vector lightDirection = (light->getPosition() - intersectionPoint).normalize();
            double nl = Vector::dot(n, lightDirection);
            nl = nl > 0 ? nl : 0.0;
            result = result + (Objects.at(index)->getMaterial() * light->getMaterial() * nl);
        }
    }
    else{
        recurseDepth++;
        result = result + getPixelColor(reflectionRay, minimum, indx, Objects, lightSources);
    }
    return result;
}

我得到的结果是这样的:

这是没有阴影的情况:

我已经尝试找到解决方案几个小时了,但找不到。我是不是用错公式了?

【问题讨论】:

    标签: c++ raytracing lighting shading


    【解决方案1】:

    经过大量研究,我删除了它从其他对象获取颜色的部分:

    Material getPixelColor(Ray ray, double min, int index, std::vector<Object*> Objects, std::vector<Object*> lightSources) {
        Vector intersectionPoint = ray.getOrigin() + ray.getDirection() * min;
        Vector n = Objects.at(index)->getNormalAt(intersectionPoint);
    
        Material result(0,0,0);
        // Check if object is lit for each light source
        for (auto const& light : lightSources) {
            //create a ray to the light and check if there is an object between the two
            Vector lightDirection = (light->getPosition() - intersectionPoint).normalize();
            Ray lightRay(intersectionPoint, lightDirection);
    
            bool hit = false;
            for (auto const& obj : Objects) {
                double distance = obj->Intersect(lightRay);
                if (INFINITY > distance && distance > 0.0001) {
                    hit = true;
                    break;
                }
            }
    
            if (!hit) {
                // Blinn-Phong
                double nl = Vector::dot(n, lightDirection);
    
                // clamp nl between 0 and 1
                if (nl > 1.0) {
                    nl = 1.0;
                }
                else if (nl < 0.0) {
                    nl = 0.0;
                }
    
                result = result + (Objects.at(index)->getMaterial() * nl);
            }
        }
        return result;
    }
    

    所以我得到了想要的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2017-08-16
      • 2012-10-04
      • 2012-05-23
      • 1970-01-01
      相关资源
      最近更新 更多