0

我目前正在玩一些我用 lua 和 love2d 实现的 3D 软件渲染。论坛中的某个人向我展示了此链接以了解更多信息: C++ Software Renderer

这是一个用 C++ 编写的软件渲染器的教程,没有使用额外的库。所以我认为这将是一个好的开始。

不过,我对 C++ 还是有点陌生​​,尽管我有 C、Objective-C、Swift、Java 和 Lua 方面的经验。

首先,我将 3 个文件加载到命令行 C++ Xcode 项目中。

  • 主文件
  • tgaimage.h
  • tgaimage.cpp

当我构建运行应用程序时,我应该得到一个位于 User/Libraries/Developer/Xcode/projectname/Build/Products/Debug/output.tga 中的 .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;
}

如何使它将文件保存在不同的路径中?

4

1 回答 1

1

您可以通过以下方式在给定路径创建文件:

const char* out_file_path = "C:/User/Name/Documents/filename.txt";
std::ofstream out_file(out_file_path);

这将创建一个filename.txt在路径中调用的文件(在 Windows 上) User/Name/Documents。当然,这适用于您提供的任何路径,因此只需在const char*参数中提供必要的路径名即可。

于 2016-05-04T13:08:22.923 回答