Создание JPG с помощью Ray Tracing (Ray Tracing за один выходной)

Я следую за книгой Ray Tracing in Weekend, в которой автор создает небольшой Ray Tracer, используя простой C ++, и в результате получается PPM изображение.

Авторский код
Автор's code

Который производит это изображение PPM.
Который производит это изображение PPM.

Таким образом, автор предлагает в качестве упражнения сделать так, чтобы программа производила JPG изображение через stb_image библиотека. До сих пор я пытался изменить исходный код следующим образом:

#include <fstream>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
struct RGB{
unsigned char R;
unsigned char G;
unsigned char B;
};

int main(){
int nx = 200;
int ny = 100;

struct RGB data[nx][ny];

for(int j = ny - 1 ; j >= 0 ; j-- ){
for(int i = 0; i < nx ; i++){

float r = float(i) / float(nx);
float g = float(j) / float(ny);
float b = 0.2;

int ir = int(255.99 * r);
int ig = int(255.99 * g);
int ib = int(255.99 * b);

data[i][j].R = ir;
data[i][j].G = ig;
data[i][j].B = ib;
}
}
stbi_write_jpg("image.jpg", nx, ny, 3, data, 100);
}

И вот результат: И это результат

Как видите, мой результат немного отличается, и я не знаю почему.
Основными проблемами являются:

  1. Что черный цвет отображается в верхнем левом углу экрана, и, как правило, цвета отображаются не в правильном порядке слева направо, сверху вниз.

  2. Изображение «разделено» пополам, и в результате получается оригинальное изображение автора, но полученное в паре.

Вероятно, я что-то неправильно понимаю о пути STB_IMAGE_WRITE предполагается, что если кто-нибудь, имеющий опыт работы с этой библиотекой, может сказать мне, что происходит, я был бы благодарен.

РЕДАКТИРОВАТЬ 1 Я реализовал изменения, предложенные @ 1201ProgramAlarm в комментариях плюс я изменил struct RGB data[nx][ny] в struct RGB data[ny][nx] ,так что результат теперь таков.

-1

Решение

Библиотека должна работать как положено. Проблема в том, как вы даете данные, и что вы должны сделать, это инвертировать ось Y. Поэтому, когда вы находитесь с индексом 4 с самого начала, вы должны указать цвет индекса 4 с конца.

Принимая результат от вашего редактирования, просто измените строку:

float g = float(j) / float(ny);

в

float g = float(ny - 1 - j) / float(ny);
0

Другие решения

У вас неправильные индексы для data, Переменная внутреннего цикла должна быть вторым индексом (data[j][i]).

0

По вопросам рекламы [email protected]