我正在关注周末的 Ray Tracing 一书,其中作者使用纯 C++ 生成了一个小型 Ray Tracer,结果是一个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);
}
这是结果:
如您所见,我的结果略有不同,我不知道为什么。主要问题是:
黑色显示在屏幕的左上角,并且通常颜色不会以从左到右、从上到下的正确顺序显示。
图像被“分割”成两半,结果实际上是作者的原始图像,但成对生成????
可能我对STB_IMAGE_WRITE应该使用的方式有一些误解,所以如果有使用这个库的人可以告诉我发生了什么,我将不胜感激。
编辑 1我实施了@1201ProgramAlarm 在评论中建议的更改,加上我更改struct RGB data[nx][ny]
为struct RGB data[ny][nx]
,所以现在的结果是这样的。