C++ 语法错误:意外的$end位于标记“处”&书信电报;EOF>&引用;带有任何着色器的GLSL

C++ 语法错误:意外的$end位于标记“处”&书信电报;EOF>&引用;带有任何着色器的GLSL,c++,opengl,C++,Opengl,我见过其他类似的问题,现在我知道这通常是由于错误的着色器加载代码造成的,但是我尝试了很多不同的加载方法,我总是会遇到这个错误。以下是我当前正在使用的加载代码(对于顶点着色器,我对片段着色器也执行相同的操作): GLuint VertexShaderID=glCreateShader(GL_VERTEX_着色器); 字符串VertexShaderCode; std::ifstream VertexShaderStream(顶点文件路径,std::ios::in); 如果(VertexShaderS

我见过其他类似的问题,现在我知道这通常是由于错误的着色器加载代码造成的,但是我尝试了很多不同的加载方法,我总是会遇到这个错误。以下是我当前正在使用的加载代码(对于顶点着色器,我对片段着色器也执行相同的操作):

GLuint VertexShaderID=glCreateShader(GL_VERTEX_着色器);
字符串VertexShaderCode;
std::ifstream VertexShaderStream(顶点文件路径,std::ios::in);
如果(VertexShaderStream.is_open()){
std::string Line=“”;
while(getline(VertexShaderStream,Line))
VertexShaderCode+=“\n”+行;
VertexShaderStream.close();
}
闪烁结果=GLU FALSE;
int信息长度;
//编译顶点着色器
printf(“编译着色器:%s\n”,顶点文件路径);
char const*VertexSourcePointer=VertexShaderCode.c_str();
glShaderSource(VertexShaderID,1,&VertexSourcePointer,NULL);
glCompileShader(VertexShaderID);
//检查顶点着色器
glGetShaderiv(VertexShaderID、GL\u编译状态和结果);
glGetShaderiv(VertexShaderID、GL\u信息\u日志长度和信息日志长度);
std::vector VertexShaderErrorMessage(InfoLogLength);
glGetShaderInfoLog(VertexShaderID、InfoLogLength、NULL和VertexShaderErrorMessage[0]);
fprintf(标准输出、%s\n、&VertexShaderErrorMessage[0]);
我也试过:

    GLuint VertexShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    std::ifstream shaderFile(vertex_file_path);
    //Error out here.
    stringstream shaderData;
    shaderData << shaderFile.rdbuf();  //Loads the entire string into a string stream.
    shaderFile.close();
    const std::string &VertexShaderCode = shaderData.str(); //Get the string stream as a std::string.
    GLint Result = GL_FALSE;
    int InfoLogLength;
    printf("Compiling shader : %s\n", vertex_file_path);
    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
    glCompileShader(VertexShaderID);

    // Check Vertex Shader
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> VertexShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);
GLuint VertexShaderID=glCreateShader(GL\u FRAGMENT\u着色器);
std::ifstream着色器文件(顶点文件路径);
//这里有个错误。
stringstream shaderData;

shaderData您是如何将长度参数传递给glShaderSource的。您执行的类型转换应该会触发一个厚厚的警告。正确的方法是将
size()
的结果放入变量中。然后将指向该变量的指针指向glShaderSource。

谢谢!我做得不对。但我现在已经更正了它,将它保存为一个size\u t变量,然后将该变量类型转换为(GLint*),我仍然得到相同的结果errors@XaitormanX字体你为什么打字呢。您应该从中获取一个指针:
size\t sourcelength=…size();glShaderSource(…,1,&sourcestring,&sourcelength)因为我得到了这个错误:
无法将参数4从“size\u t*”转换为“const GLint*”
已修复!毕竟,这是一个非常愚蠢的错误。我努力将顶点着色器编码为一个字符串,而不是从文件加载它,结果成功了,所以我认为从文件加载字符串的部分失败了。我检查了项目的目录,发现我只向项目添加了文件引用,而没有实际的着色器文件。在将这些文件添加到项目中后,效果很好,很抱歉提出了这样一个愚蠢的问题!但是,由于您对我的代码的更正是正确且必要的(如果我决定传递长度而不是null),因此我将接受您的回答。如果您没有在程序末尾指定右括号
}
,则会出现这种情况:P
    GLuint VertexShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    std::ifstream shaderFile(vertex_file_path);
    //Error out here.
    stringstream shaderData;
    shaderData << shaderFile.rdbuf();  //Loads the entire string into a string stream.
    shaderFile.close();
    const std::string &VertexShaderCode = shaderData.str(); //Get the string stream as a std::string.
    GLint Result = GL_FALSE;
    int InfoLogLength;
    printf("Compiling shader : %s\n", vertex_file_path);
    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
    glCompileShader(VertexShaderID);

    // Check Vertex Shader
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> VertexShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);
// Link the program
fprintf(stdout, "Linking program\n");
GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);

// Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ProgramErrorMessage( max(InfoLogLength, int(1)) );
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);