1

我正在研究一些 OpenGL 的东西,并且在加载纹理时,我使用的是绝对路径,这显然是不好的。我的问题是我找不到如何将这些路径转换为相对路径的资源。这是采用路径的代码。

语言:C++

操作系统:Windows 10(虽然我更希望有一个跨平台的解决方案)

此处使用的库和头文件:OpenGL 4.6(通过 GLAD 加载)、stb_image.h

IDE:Visual Studio 2019

// Where the path is used
unsigned int texture = loadTexture("C:\\Users\\Name\\OneDrive\\Desktop\\C++ Projects\\Working Game Engine\\texture.png");

// This is the function where that path is inputted
unsigned int loadTexture(char const * path) {
    unsigned int textureID;
    glGenTextures(1, &textureID);

    int width, height, nrComponents;
    unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);
    if (data) {
        GLenum format;
        if (nrComponents == 1) {
            format = GL_RED;
        }
        else if (nrComponents == 3) {
            format = GL_RGB;
        }
        else if (nrComponents == 4) {
            format = GL_RGBA;
        }

        glBindTexture(GL_TEXTURE_2D, textureID);
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        stbi_image_free(data);
    }
    else {
        std::cout << "Texture failed to load at path: " << path << "\n";
        stbi_image_free(data);
    }
}

到目前为止,我还无法用一个有效的、不太具体和冗长的路径替换该路径。

4

1 回答 1

0

就像其他用户说的那样,您应该弄清楚 VS 在哪里保存/加载您的可执行文件。所以也许可以试试Tutorials Point 的这个教程来找到当前的工作目录,你可以从那里制作你的相对路径:

#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

#include<iostream>
using namespace std;

std::string get_current_dir() {
   char buff[FILENAME_MAX]; //create string buffer to hold path
   GetCurrentDir( buff, FILENAME_MAX );
   string current_working_dir(buff);
   return current_working_dir;
}

main() {
   cout << get_current_dir() << endl;
}

编辑:用户 Khoi V 在下面准确评论了为什么相对路径更适合编译代码,我很抱歉。将其留在这里以供将来参考:

但我想问一下,为什么您认为绝对路径不好?首选绝对路径的原因有:

  • 绝对路径更清晰:谁必须维护/修改您的脚本(您或其他人)将能够知道每次涉及哪些目录;
  • 使用绝对路径,您可以确定所涉及的目录是您在脚本中编写的确切路径的目录;
  • 相对路径较短,但您需要确定您正在使用的子树。
于 2021-06-14T13:39:13.777 回答