Я пишу raytracer на 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
Приведенный выше код находится внутри цикла, который проверяет каждый пиксель. «луч» — это направление луча, а «источник» — это происхождение этого луча. ‘objList’ — это вектор stl, который содержит каждый объект в сцене. Я проверил, чтобы убедиться, что каждый объект на самом деле помещается в вектор.
Я знаю, что мои тесты пересечения работают … по крайней мере для одного объекта каждого типа, который рендерится. У меня была программа, печатающая в файл все значения, которые когда-либо получал «bestObj», но, похоже, никогда не регистрировалось, что любой из объектов, кроме последнего, является «bestObj». Я понимаю, что это проблема, что никакой другой объект не установлен как ‘bestObj’, но я не могу понять, почему!
Любая помощь будет оценена 🙂
Я разобрался в проблеме, благодаря didierc. Я не уверен, о чем он на самом деле говорил, но это заставило меня задуматься о том, как я справляюсь со своими указателями. Действительно, хотя мой вектор отталкивал каждый объект, я не создавал новые объекты каждый раз, когда отбрасывал один назад. Это привело к тому, что каждая сфера в векторе stl указывает на одну и ту же (то есть последнюю, считанную из файла)!
Других решений пока нет …