0

我正在用 C++ 编写光线追踪器,但我很难理解为什么我的输出图像不包含所有应该存在的对象。也就是说,我正在使用球体和平面,并且我不能绘制多个实例。

对象值是从 ASCII 文件中读取的(例如半径、位置、法线等)。这是我的相交测试代码。

//check primary ray against each object
    for(int size = 0; size < objList.size(); size++){
      //if intersect
      if(objList[size]->intersect(ray,origin,&t)){
        if(t < minDist){ //check depth
          minDist = t; //update depth
          bestObj = size; //update closest object
        }
      }
    }
    vec3 intersection = origin + minDist*ray;

//figure out what to draw, if anything
    color_t shadeColor;
    if(bestObj != -1){ //valid object
      //get base color
      //using rgb color
      if(objList[bestObj]->rgbColor != vec3(-1)){
        shadeColor.r = objList[bestObj]->rgbColor.x;
        shadeColor.g = objList[bestObj]->rgbColor.y;
        shadeColor.b = objList[bestObj]->rgbColor.z;
      }
      //else using rgbf color
      else if(objList[bestObj]->rgbfColor != vec4(-1)){
        shadeColor.r = objList[bestObj]->rgbfColor.x;
        shadeColor.g = objList[bestObj]->rgbfColor.y;
        shadeColor.b = objList[bestObj]->rgbfColor.z;
        //need to do something with alpha value
      }
      //else invalid color
      else{
        cout << "Invalid color." << endl;
      }

//...the rest is just shadow and reflection tests. There are bugs here as well, but those are for another post

上面的代码在一个检查每个像素的循环中。'ray' 是光线的方向,'origin' 是那条光线的原点。'objList' 是一个 stl 向量,用于保存场景中的每个对象。我已经测试以确保每个对象实际上都被放入向量中。

我知道我的交集测试正在工作......至少对于呈现的每种类型的一个对象。我已经让程序将“bestObj”所获得的所有值打印到一个文件中,但它似乎从未注册过除最后一个之外的任何对象都是“bestObj”。我意识到这是问题所在,没有其他对象被设置为“bestObj”,但我不知道为什么!

任何帮助,将不胜感激 :)

4

1 回答 1

0

感谢didierc,我发现了问题所在。我不确定他到底在说什么,但这让我想到了我是如何处理我的指针的。确实,尽管我的向量将每个对象都推回,但每次我推回一个对象时,我并没有创建新的对象。这导致 stl 向量中的每个球体都指向同一个球体(也就是从文件中读取的最后一个球体)!

于 2013-04-25T04:04:22.867 回答