Я следую за книгой Ray Tracing in Weekend, в которой автор создает небольшой Ray Tracer, используя простой C ++, и в результате получается 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);
}
И вот результат:
Как видите, мой результат немного отличается, и я не знаю почему.
Основными проблемами являются:
Что черный цвет отображается в верхнем левом углу экрана, и, как правило, цвета отображаются не в правильном порядке слева направо, сверху вниз.
Изображение «разделено» пополам, и в результате получается оригинальное изображение автора, но полученное в паре.
Вероятно, я что-то неправильно понимаю о пути STB_IMAGE_WRITE предполагается, что если кто-нибудь, имеющий опыт работы с этой библиотекой, может сказать мне, что происходит, я был бы благодарен.
РЕДАКТИРОВАТЬ 1 Я реализовал изменения, предложенные @ 1201ProgramAlarm в комментариях плюс я изменил struct RGB data[nx][ny]
в struct RGB data[ny][nx]
,так что результат теперь таков.
Библиотека должна работать как положено. Проблема в том, как вы даете данные, и что вы должны сделать, это инвертировать ось Y. Поэтому, когда вы находитесь с индексом 4 с самого начала, вы должны указать цвет индекса 4 с конца.
Принимая результат от вашего редактирования, просто измените строку:
float g = float(j) / float(ny);
в
float g = float(ny - 1 - j) / float(ny);
У вас неправильные индексы для data
, Переменная внутреннего цикла должна быть вторым индексом (data[j][i]
).