В настоящее время я играю с программным рендерингом 3D, который я реализовал с помощью lua и love2d. Кто-то на форумах показал мне эту ссылку, чтобы узнать еще больше:
C ++ Software Renderer
Это учебное пособие для программного рендера, написанного на C ++, где не используются дополнительные библиотеки. Поэтому я подумал, что это будет хорошим началом.
Однако я немного новичок в C ++, хотя у меня есть опыт работы с C, Objective-C, Swift, Java и Lua.
Для начала я загрузил 3 файла в проект командной строки C ++ Xcode.
Когда я собираюсь запустить приложение, я должен получить файл .tga, который находится в папке User / Libraries / Developer / Xcode / projectname / Build / Products / Debug / output.tga.
Я мог бы изменить путь к своему рабочему каталогу, расположенному в User / Developer / Xcode Projects / tinyRenderer /, или я мог сделать это в коде. Однако это точно, я не знаю, как это сделать.
В main.cpp:
image.write_tga_file("output.tga");
называется.
В tgaimage.h:
bool write_tga_file(const char *filename, bool rle=true);
И файл реализации:
bool TGAImage::write_tga_file(const char *filename, bool rle) {
unsigned char developer_area_ref[4] = {0, 0, 0, 0};
unsigned char extension_area_ref[4] = {0, 0, 0, 0};
unsigned char footer[18] = {'T','R','U','E','V','I','S','I','O','N','-','X','F','I','L','E','.','\0'};
std::ofstream out;
out.open (filename, std::ios::binary);
if (!out.is_open()) {
std::cerr << "can't open file " << filename << "\n";
out.close();
return false;
}
TGA_Header header;
memset((void *)&header, 0, sizeof(header));
header.bitsperpixel = bytespp<<3;
header.width = width;
header.height = height;
header.datatypecode = (bytespp==GRAYSCALE?(rle?11:3):(rle?10:2));
header.imagedescriptor = 0x20; // top-left origin
out.write((char *)&header, sizeof(header));
if (!out.good()) {
out.close();
std::cerr << "can't dump the tga file\n";
return false;
}
if (!rle) {
out.write((char *)data, width*height*bytespp);
if (!out.good()) {
std::cerr << "can't unload raw data\n";
out.close();
return false;
}
} else {
if (!unload_rle_data(out)) {
out.close();
std::cerr << "can't unload rle data\n";
return false;
}
}
out.write((char *)developer_area_ref, sizeof(developer_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)extension_area_ref, sizeof(extension_area_ref));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.write((char *)footer, sizeof(footer));
if (!out.good()) {
std::cerr << "can't dump the tga file\n";
out.close();
return false;
}
out.close();
return true;
}
Как мне сделать так, чтобы файл сохранялся по отдельному пути?
Вы можете создать файл по указанному пути с помощью:
const char* out_file_path = "C:/User/Name/Documents/filename.txt";
std::ofstream out_file(out_file_path);
Это создает файл (в Windows) с именем filename.txt
в пути User/Name/Documents
, Конечно, это будет работать для любого пути, который вы дадите, поэтому просто укажите необходимый путь в const char*
параметр и все готово.
Других решений пока нет …