Создание JPG с помощью Ray Tracing (Ray Tracing за один выходной) - PullRequest
0 голосов
/ 16 октября 2018

Я слежу за книгой «Трассировка лучей на выходных», в которой автор создает небольшой трассировщик лучей, используя простой C ++, и в результате получается PPM-изображение .

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

, который производит это изображение PPM.
Which produces this PPM image.

Поэтому автор предлагает в качестве упражнения сделать его такимпрограмма создает 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);
}

И вот результат: And this is the result

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

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

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

float g = float(j) / float(ny);
*От 1005 * до
float g = float(ny - 1 - j) / float(ny);
0 голосов
/ 16 октября 2018

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

...