我正在用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',但我无法弄清楚为什么!
任何帮助将不胜感激:)
答案 0 :(得分:0)
我想出了问题,感谢didierc。我不确定他到底在说什么,但这让我想到我是如何处理我的指针的。实际上,虽然我的矢量正在推回每个物体,但每次推回物体时我都没有创造新的物体。这导致stl向量中的每个球体指向同一个(也就是从文件中读入的最后一个)!