通过光线追踪制作一张JPG(一个周末的光线追踪)
Producing a JPG via Ray Tracing(Ray Tracing in one Weekend)
我在周末关注光线追踪一书,其中作者使用纯 C++ 制作了一个小型光线追踪器,结果是 PPM 图像。
作者代码
生成此 PPM 图像。
因此作者建议将其作为练习,以便程序通过 stb_image 库生成 JPG 图像。到目前为止,我尝试像这样更改原始代码:
#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);
}
这是结果:
如您所见,我的结果略有不同,我不知道为什么。
主要问题是:
黑色显示在屏幕的左上角,一般情况下颜色的显示顺序不是从左到右,从上到下。
图片是"split"对半的结果居然是作者原图但是成对制作了????
可能我对 STB_IMAGE_WRITE 应该使用的方式有一些误解,所以如果任何使用过该库的人能告诉我发生了什么,我将不胜感激。
编辑 1 我在评论中实施了 @1201ProgramAlarm 建议的更改,并且我将 struct RGB data[nx][ny]
更改为 struct RGB data[ny][nx]
,so the result now is this.
您 data
的索引有误。内循环变量应该是第二个下标(data[j][i]
).
库应该按预期工作。问题是你如何提供数据,你应该做的是反转 y 轴。所以,当你从一开始就在索引 4 处时,你应该从最后给出索引 4 的颜色。
从您的编辑中获取结果,只需更改以下行:
float g = float(j) / float(ny);
至
float g = float(ny - 1 - j) / float(ny);
我在周末关注光线追踪一书,其中作者使用纯 C++ 制作了一个小型光线追踪器,结果是 PPM 图像。
作者代码
生成此 PPM 图像。
因此作者建议将其作为练习,以便程序通过 stb_image 库生成 JPG 图像。到目前为止,我尝试像这样更改原始代码:
#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);
}
这是结果:
如您所见,我的结果略有不同,我不知道为什么。 主要问题是:
黑色显示在屏幕的左上角,一般情况下颜色的显示顺序不是从左到右,从上到下。
图片是"split"对半的结果居然是作者原图但是成对制作了????
可能我对 STB_IMAGE_WRITE 应该使用的方式有一些误解,所以如果任何使用过该库的人能告诉我发生了什么,我将不胜感激。
编辑 1 我在评论中实施了 @1201ProgramAlarm 建议的更改,并且我将 struct RGB data[nx][ny]
更改为 struct RGB data[ny][nx]
,so the result now is this.
您 data
的索引有误。内循环变量应该是第二个下标(data[j][i]
).
库应该按预期工作。问题是你如何提供数据,你应该做的是反转 y 轴。所以,当你从一开始就在索引 4 处时,你应该从最后给出索引 4 的颜色。
从您的编辑中获取结果,只需更改以下行:
float g = float(j) / float(ny);
至
float g = float(ny - 1 - j) / float(ny);