На самом деле, комментарий, но слишком много текста для этого…
Ваш отступ нарушен.
Следовательно, вы не заметили, что return 0;
появляется во внешнем for
l oop, этот:
for(int j = h - 1; j >= 0; j--)
{
оканчивается на:
fclose(fp);
return 0;
}
Кроме того,
fwrite(pixel, 3, 1, fp);
появляется в самом внутреннем l oop
for (int j = 0; j < objects.size(); j++)
, что тоже ИМХО неверно.
Итак, созданный файл .ppm
утверждает, что имеет w
× h
пикселей, но вместо этого он обеспечивает w
× objects.size()
пикселей.
Если objects.size() < h
(что я и ожидал), то в файле .ppm
будет слишком мало пикселей, и ImageMagick заметит и пожалуется.
Ваш исходный код, автоматически отформатирован в моем VS2017:
int main()
{
const int w = 200, h = 100;
FILE *fp;
fp = fopen("img.ppm", "wb");
fprintf(fp, "P6\n%d %d\n255\n", w, h);
vec lower_corner(-2.0, -1.0, -1.0);
vec horizontal(4.0, 0.0, 0.0);
vec vertical(0.0, 2.0, 0.0);
vec origin(0.0, 0.0, 0.0);
vector <sphere> objects;
objects.push_back(sphere(vec(0, -100.5, -1), 100, vec(0, 1, 0)));
objects.push_back(sphere(vec(0, 0, -1), 0.5, vec(1, 0, 0)));
objects.push_back(sphere(vec(5, 5, -2), 3, vec(1, 0, 0)));
for (int j = h - 1; j >= 0; j--)
{
for (int i = 0; i < w; i++)
{
vec col(0, 0, 0);
static unsigned char pixel[3];
sphere* ClosestObject = NULL;
float u = float(i + random_double()) / float(w);
float v = float(j + random_double()) / float(h);
ray r(origin, lower_corner + u * horizontal + v * vertical);
float t = 0.0;
float t_near = 200000.0;
vec pixelColor(0.52, 0.52, 0.48);
for (int j = 0; j < objects.size(); j++)
{
if (t = objects[j].intersect(r))
{
if (t < t_near)
{
ClosestObject = &objects[j];
t_near = t;
}
}
if (t = 200000.0)
col = pixelColor;
else
col = color(r, t, ClosestObject->color, ClosestObject->centre);
pixel[0] = int(clamp(col.r() * 255));
pixel[1] = int(clamp(col.g() * 255));
pixel[2] = int(clamp(col.b() * 255));
fwrite(pixel, 3, 1, fp);
}
}
fclose(fp);
return 0;
}
}
Пожалуйста, проверьте отступ и правильно разместите закрывающие фигурные скобки. Тогда это должно работать как прежде ...