Copiei o código abaixo ray_tracer.cpp
, compilei e executei ray_tracer.exe > image.ppm
. Ele gerou a imagem que eu esperava ao executar no prompt de comando, mas quando executei esse código no terminal VS Code, ele gerou um arquivo com o dobro do tamanho e não tinha o formato/codificação correto.
#include <iostream>
int main() {
// Image
int image_width = 256;
int image_height = 256;
// Render
std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";
for (int j = 0; j < image_height; j++) {
for (int i = 0; i < image_width; i++) {
auto r = double(i) / (image_width-1);
auto g = double(j) / (image_height-1);
auto b = 0.0;
int ir = int(255.999 * r);
int ig = int(255.999 * g);
int ib = int(255.999 * b);
std::cout << ir << ' ' << ig << ' ' << ib << '\n';
}
}
}
Aqui está o formato da execução do prompt de comando:
P3
256 256
255
0 0 0
1 0 0
2 0 0
3 0 0
A saída da execução do VS Code não está sendo copiada corretamente, então aqui está uma captura de tela:
Pelo que vale, os dois arquivos parecem idênticos quando abertos no VS Code, mas se eu abrir os arquivos usando o File Viewer Plus, vejo as representações que colei acima.
Isso é um problema conhecido? Existe uma configuração de código VS que posso usar para duplicar o comportamento do prompt de comando?
Parece ser um problema de codificação. Você talvez presuma a saída de UTF-8 - mas o VS Code está usando Powershell e usa algo diferente de UTF-8. Ao materializá-lo, você vê estranhos personagens adicionais.
Você pode usar
WriteConsoleW
a função (API do Windows) para definir a saída como algo que resulte em uma saída válida em seu arquivo final.BTW: recomendaria OpenEXR como arquivo de saída -> https://medium.com/@Vertexwahn/image-file-formats-52bbc8a523b4