2016-04-18 106 views
0

问题只出现在.exe文件时,它说它尝试使用文件读取器方法来查找我正在使用的着色器,但是当我在Visual Studio中运行它时它工作正常。这是文件读取方法.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; 
    } 

具体地说,它creakes上FSEEK(文件,0,SEEK_END)部分调用它是

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文件与可执行文件位于同一目录中。或者,您需要在识别文件的位置时指定绝对路径。或者,您需要将开发投入到“资源加载器”类型的对象中,该对象将动态查询并将外部资源加载到您的程序中;作为一个例子,我会编写一个程序,递归地搜索程序所在的文件夹的所有子目录,并将每个文件映射到程序中的可寻址资源。

当您在Visual Studio中运行程序时,这不是问题,因为必须读入的文件位于项目的源目录中,并且默认情况下当Visual Studio调试程序时,它使用源目录作为程序的工作目录,而当您自行运行.exe时,它使用可执行文件所在的目录(或运行它的脚本所在的目录)。

+0

我将文件移动到可执行文件目录,现在它的工作原理谢谢。 – Forseti

相关问题