という問題が発生します。.exeファイルは、ファイルリーダーメソッドを使用して私が使用しているシェーダを検索しようとしていますが、Visual Studioそれはうまく動作します。これは、一部、具体的にはfseek関数(ファイル、0、SEEK_END)にブレークをcreakesファイル読み込み方法.exeはコンパイルされませんが、Visual Studioで実行すると
static std::string read_file(const char* filepath)
{
FILE* file = fopen(filepath, "rt");
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
delete[] data;
return result;
}
でそれを呼び出す行は
shader = new Shader("basic.vert", "basic.frag");
ファイルが同じフォルダ内にあるさ.cppと.exeフォルダにあります。これは少し長いですが、私は徹底的になりたかったと私は問題を引き起こす可能性のあるどのビット必ず波平場合、シェーダは、ここで
Shader::Shader(const char* vertexPath, const char* fragPath)
: m_VertexPath(vertexPath), m_FragPath(fragPath)
{
m_ShaderID = load();
}
GLuint Shader::load()
{
GLuint program = glCreateProgram();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
std::string vertexSourceString = read_file(m_VertexPath).c_str();
std::string fragSourceString = read_file(m_FragPath).c_str();
const char* vertexSource = vertexSourceString.c_str();
const char* fragSource = fragSourceString.c_str();
glShaderSource(vertex, 1, &vertexSource, NULL);
glCompileShader(vertex);
GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cout << "Failed to compile vertex shader :(" << std::endl << &error[0] << std::endl;
glDeleteShader(vertex);
return 0;
}
glShaderSource(fragment, 1, &fragSource, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment, length, &length, &error[0]);
std::cout << "Failed to compile fragment shader :(" << std::endl << &error[0] << std::endl;
glDeleteShader(fragment);
return 0;
}
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vertex);
glDeleteShader(fragment);
return program;
}
気の毒に定義されています。
この直前に['GetCurrentDirectory'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v = vs.85).aspx)を呼び出し、値 –
を出力してください'std :: string vertexSourceString = read_file(m_VertexPath).c_str();'これをしないでください。 'std :: string vertexSourceString = read_file(m_VertexPath);'と書くだけです。 – kfsone