简体   繁体   中英

Cannot Compile Vertex Shader: Unexpected $end at token “<EOF>”

I'm having some issues with compiling my vertex shaders under OpenGL. I have a pretty standard vertex shader:

#version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
void main(void)
{
gl_Position = in_Position;
ex_Color = in_Color;
}

and my shader loading function looks like:

string temp = LoadFile(vShaderPath);
const char* vShaderString = temp.c_str();
const char* vShaderPathC = vShaderPath.c_str();
fprintf(stderr, "File: %s \nContents: %s\n", vShaderPathC, vShaderString);
temp = LoadFile(fShaderPath);
const char* fShaderString = temp.c_str();

vShaderHandle = glCreateShader(GL_VERTEX_SHADER);
fShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(vShaderHandle, 1, &vShaderString, NULL);
glShaderSource(fShaderHandle, 1, &fShaderString, NULL);

GLint compiled;

glCompileShader(vShaderHandle);
glCompileShader(fShaderHandle);

glGetShaderiv(vShaderHandle, GL_COMPILE_STATUS, &compiled);
if(compiled == false)
{
    fprintf(stderr, "ERROR: Vertex shader not compiled properly.\n");

    GLint blen = 0;
    GLsizei slen = 0;

    glGetShaderiv(vShaderHandle, GL_INFO_LOG_LENGTH , &blen);
    if (blen > 1)
    {
        GLchar* compiler_log = new GLchar[blen];
        glGetInfoLogARB(vShaderHandle, blen, &slen, compiler_log);
        fprintf(stderr, "compiler log:\n %s", compiler_log);
        delete [] compiler_log;
    }
}

but when I run my program, I get an output of:

INFO: OpenGL Version: 3.3.0 NVIDIA 310.19
File: vShader.v.glsl
Contents: #version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
void main(void)
{
    gl_Position = in_Position;
    ex_Color = in_Color;
}

ERROR: Vertex shader not compiled properly.
compiler log:
  (0) : error C0000: syntax error, unexpected $end at token "<EOF>"

Loadfile is defined:

string ShaderEffect::LoadFile(string path)
{
    ifstream in(path.c_str(), ios::in);

    if(in.is_open())
    {

        string contents;
        in.seekg(0, ios::end);
        contents.resize(in.tellg());
        in.seekg(0, ios::beg);
        in.read(&contents[0], contents.size());
        in.close();
        return contents;
    }
    else
        throw "Problem reading file!";
}

I know the glsl code itself is not the problem because I have hard coded the string in:

const char * testvShader = {
"#version 330\n"\
"layout(location=0) in vec4 in_Position;\n"\
"layout(location=1) in vec4 in_Color;\n"\
"out vec4 ex_Color;"
"void main()\n"\
"{\n"\
"    gl_Position = in_Position;\n"\
"    ex_Color = in_Color;\n"\
"}"};

and when I switch &vShaderString to &testvShader the program runs fine. But I don't see how the loading can be the problem, because the fragment shader loads the same way and compiles and runs perfectly fine, and I print the file to the console before compiling it and it looks fine. I'm at my wits end, I can't figure out what the issue is.

PS I'm running on Fedora, if that matters.

You call c_str() on temp and store the result in a variable, and then you modify temp and use the saved result of c_str() . This doesn't work because the result of c_str() becomes invalid if you modify the string.

This compiler error is usually caused by trailing garbage. The most simple remedy is telling OpenGL which length the source string has exactly.

Replace your glShaderSource calls with

const char* vShaderString = temp.c_str();
int vertex_shader_string_length = temp.length();

/* ... */

const char* fShaderString = temp.c_str();
int fragment_shader_string_length = temp.length();

glShaderSource(vShaderHandle, 1, &vShaderString, &vertex_shader_string_length);
glShaderSource(fShaderHandle, 1, &fShaderString, &fragment_shader_string_length);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM