C++ 无法编译顶点着色器:意外$end at token"&书信电报;EOF>&引用;

C++ 无法编译顶点着色器:意外$end at token"&书信电报;EOF>&引用;,c++,opengl,glsl,shader,vertex-shader,C++,Opengl,Glsl,Shader,Vertex Shader,我在OpenGL下编译顶点着色器时遇到一些问题。我有一个非常标准的顶点着色器: #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; } 我的着色器加载函数如下所示: string temp = Lo

我在OpenGL下编译顶点着色器时遇到一些问题。我有一个非常标准的顶点着色器:

#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;
}
我的着色器加载函数如下所示:

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;
    }
}
但当我运行我的程序时,我得到的输出是:

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>"
我知道glsl代码本身不是问题,因为我已将字符串硬编码到:

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"\
"}"};
当我将&vShaderString切换到&testvShader时,程序运行良好。但我不知道加载怎么会有问题,因为片段着色器以相同的方式加载,编译和运行都非常好,我在编译之前将文件打印到控制台,看起来很好。我束手无策,搞不清楚问题出在哪里


另外,如果有必要的话,我正在Fedora上运行。

此编译器错误通常是由尾部垃圾引起的。最简单的补救方法是告诉OpenGL源字符串的确切长度

将glShaderSource调用替换为

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);

temp
上调用
c_str()
并将结果存储在变量中,然后修改
temp
并使用保存的
c_str()
结果。这不起作用,因为如果修改字符串,c_str()的结果将无效。

忽略原始海报代码中的错误,此注释帮助我解决了相同的问题。ATI的驱动程序很好地编译了我的源代码,但nVidia失败并显示错误;这个建议解决了这个错误。我刚遇到那个问题。这肯定是由unicode编码文本之间的一些
复制粘贴操作造成的,这些操作将一些错误的隐藏字符放在了glsl编译器预期的纯ascii错误理解的地方。
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);