我正在用 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”,但我不知道为什么!
任何帮助,将不胜感激 :)