首页 文章

顶点着色器中的GLSL奇怪'<'语法错误[重复]

提问于
浏览
0

这个问题在这里已有答案:

好的,所以我开始使用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 回答

  • 3

    这是你的问题

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

    在此之后 vertex_shader 指针再次变为 not ,只要容器没有改变(指定给它正在改变), 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();
    

相关问题