【发布时间】:2020-01-21 05:14:46
【问题描述】:
所以我正在尝试用 C++ 编写一个类似于this 的着色器类。这是我的文件结构:
| -- /source
| | -- main.cpp
| | -- /Shaders
| | | -- Shader.h
| | | -- shader.frag
| | | -- shader.vert
在我的 main.cpp 文件中,我导入了 shaders.h。 Shaders.h 包含着色器类,它从 shader.frag 和 shader.vert 文件中读取着色器代码(或者应该如此)。我从 main.cpp 传递的路径是 Shaders/shader.frag 和 Shaders/shader.vert,我收到错误 No such file or directory。
这是我(或他们)相关的着色器代码:
#ifndef SHADER_H
#define SHADER_H
#include <glad/glad.h>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
Shader(const char* vertexPath, const char* fragmentPath)
{
// 1. retrieve the vertex/fragment source code from filePath
std::string vertexCode;
std::string fragmentCode;
std::ifstream vShaderFile;
std::ifstream fShaderFile;
// ensure ifstream objects can throw exceptions:
vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try
{
// open files
vShaderFile.open(vertexPath); <------- this is where it is getting caught
fShaderFile.open(fragmentPath); <---------- and i assume it would be here as well
std::stringstream vShaderStream, fShaderStream;
// read file's buffer contents into streams
vShaderStream << vShaderFile.rdbuf();
fShaderStream << fShaderFile.rdbuf();
// close file handlers
vShaderFile.close();
fShaderFile.close();
// convert stream into string
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
}
catch (std::ifstream::failure e)
{
char buffer[256];
strerror_s(buffer, 256, errno);
printf("ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ: %s\n", buffer);
}
...
我尝试了多种不同的路径变体。我也尝试过传递绝对路径,并且始终得到相同的错误。我非常感谢您对此提供任何帮助。
【问题讨论】:
-
那个是txt文件还是json文件?@Saucy Dumpling
-
它只是一个文本文件。你认为我应该尝试重命名为 .txt 吗?
-
在打开代码时提到 .txt(即)vShaderFile.open("FILENAME.txt");,但请确保文件夹中存在的文件是 txt 不要重命名它。但是该文件应该存在于源代码所在的同一文件夹中
-
我怀疑文件后缀是你的问题。您可以阅读带有任何后缀的文本文件。如果您使用 IDE(例如 VisualStudio),则可以将二进制文件编译到单独的文件夹中。因此,当应用程序启动时,当前目录不是源文件夹,而是二进制文件所在的文件夹(默认情况下)。使用绝对文件路径或调整已启动应用程序的当前目录。在 VisualStudio 中,有一个设置(在主项目的调试下),但其他 IDE 肯定也提供了它。
-
您可以做一个非常简单的检查:从您的函数
std::ofstream ct; ct.open("bla.txt"); ct << "klaf";写入一个新文件,然后查看显示新文件的源代码树。这应该告诉你目录根在哪里。