2016-04-18 5 views
0

という問題が発生します。.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; 
} 

気の毒に定義されています。

+3

この直前に['GetCurrentDirectory'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v = vs.85).aspx)を呼び出し、値 –

+0

を出力してください'std :: string vertexSourceString = read_file(m_VertexPath).c_str();'これをしないでください。 'std :: string vertexSourceString = read_file(m_VertexPath);'と書くだけです。 – kfsone

答えて

1

basic.vertbasic.fragのファイルが実行可能ファイルと同じディレクトリにあることを確認する必要があります。または、ファイルがどこにあるかを特定するときは、絶対パスを指定する必要があります。または、外部リソースを動的にクエリしてプログラムにロードする "Resource Loader"タイプのオブジェクトに開発を投資する必要があります。たとえば、プログラムがあるフォルダのすべてのサブディレクトリを再帰的に検索するプログラムを作成し、各ファイルをプログラムのアドレス指定可能なリソースにマップします。

読み込みが必要なファイルがプロジェクトのソースディレクトリにあり、Visual StudioがプログラムをデバッグしているときにデフォルトでVisual Studioでプログラムを実行すると、これは問題ありません.exeを独自に実行すると、実行可能ファイルが存在するディレクトリ(またはそれを実行しているスクリプトが置かれているディレクトリ)が使用されますが、ソースディレクトリはプログラムの作業ディレクトリとして使用されます。

+0

私は実行可能なディレクトリにファイルを移動し、今、それはおかげで動作します。 – Forseti