GLSL很奇怪'<'顶点着色器中的语法错误

时间:2014-04-11 11:35:26

标签: c++ opengl glsl

好的,所以我开始使用openGL 4和着色器进行冒险。在编译vertext着色器时,我发现了奇怪的语法错误。

即使我采用简单的顶点着色器:

#version 400
in vec3 vector_position;
void main()
{
    gl_Position = vec4(vector_position, 1.0);
}

我确实收到了这个错误:

  

顶点着色器无法编译,但出现以下错误:   错误:0:1:错误(#132)语法错误:'<'解析错误   错误:错误(#273)1编译错误。没有生成代码

有什么奇怪之处,我的片段着色器正在编译而没有错误:

#version 400
out vec4 color;
void main()
{
    color = vec4(1.0, 0.0, 0.0, 1.0);
}

并提供此消息:

  

compiler_log:   片段着色器已成功编译为在硬件上运行。

我尝试通过在代码中将它们作为const char *来测试这些着色器,并且它们工作正常。

为了使这里更容易,还有一些额外的信息:

  • 使用SDL 2.0
  • 通过SDL2.0初始化OpenGL
  • 使用GLEW加载扩展程序
  • 通过此功能读取文本文件:

    std::ifstream file(path);
    
    if(!file.good())
    {
        OutputDebugStringA("File not found");
        return nullptr;
    }
    
    std::stringstream stream ;
    stream << file.rdbuf();
    
    file.close();
    
    return stream.str();
    

编辑:

在包含着色器的字符串末尾添加'\ 0'给了我其他错误:

compiler_log:
Vertex shader failed to compile with the following errors:
ERROR: 0:1: error(#132) Syntax error: '1.0' parse error
ERROR: error(#273) 1 compilation errors.  No code generated

EDIT2:

有人想告诉他我如何处理整个字符串:

ShaderClass ShaderLoaderClass::createStaticShader(const std::string& file)
{
    ResourceManager manager;
    std::string container = "Just simple container";
    container = manager.loadTextFile(file + ".vs");
    container.push_back('\0');
    //OutputDebugStringA(container.c_str());
    const char* vertex_shader = container.c_str();
    GLint lenVS = container.length();
    container = manager.loadTextFile(file + ".fs");
    container.push_back('\0');
    //OutputDebugStringA(container.c_str());
    const char* fragment_shader = container.c_str(); 
    GLint lenFS = container.length();


    unsigned int vs = glCreateShader (GL_VERTEX_SHADER);
    unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (vs, 1, &vertex_shader, &lenVS);
    glCompileShader (vs);
    glShaderSource (fs, 1, &fragment_shader, &lenFS);
    glCompileShader (fs);

    checkErrors(vs);
    checkErrors(fs);

    unsigned int shader_programme = glCreateProgram();
    glAttachShader (shader_programme, fs);
    glAttachShader (shader_programme, vs);
    glLinkProgram (shader_programme);

    return ShaderClass(shader_programme);
}

1 个答案:

答案 0 :(得分:3)

这是你的问题

const char* vertex_shader = container.c_str();
GLint lenVS = container.length();
container = manager.loadTextFile(file + ".fs");

此后vertex_shader指针不再有效,只要容器没有更改,c_str()指针才有效 (分配给它正在改变)

使用2 std :: strings代替:

std::string vertex_container = manager.loadTextFile(file + ".vs");
//OutputDebugStringA(vertex_container.c_str());
const char* vertex_shader = vertex_container.c_str();
GLint lenVS = vertex_container.length();

std::string fragment_container = manager.loadTextFile(file + ".fs");    
//OutputDebugStringA(fragment_container.c_str());
const char* fragment_shader = fragment_container.c_str(); 
GLint lenFS = fragment_container.length();