OpenGL着色器编译错误:令牌"<undefined>"处的意外$ undefined

zeb*_*und 12 c++ opengl error-handling compilation glsl

我看到了这个问题,它确实散发出一些亮点.尽管如此,我似乎无法弄清楚我是如何"不正确地"加载我的着色器,因为这已经执行过,而且最近没有对着色器加载代码进行任何更改,所以我认为这些错误必须来自我的绘制调用.

尽管如此,为了简洁起见,我仍然会发布着色器文件,绘制函数用于绘制我想要渲染的圆,以及在着色器文件中作为字符串加载的代码.

基本上我需要知道的是为什么我会收到这些错误以及它们到底出了什么问题呢?

(来自调试输出)

ERROR { 
    OpenGL Says: 
     Vertex info
-----------
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"

Fragment info
-------------
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"

 };
Run Code Online (Sandbox Code Playgroud)

绘制代码

    void Circle::draw( GLuint program )
    {
        const size_t centerMag = mCenter.length();

        glUseProgram( program );

        for( float t = 0; t < mCircumference; t += 0.1 )
        {
            float x = centerMag + glm::cos( 2 * M_PI * t );
            float y = centerMag + glm::sin( 2 * M_PI * t );

            mVertices->push_back( glm::vec4( x, y, 0, 1 ) );
        }

        QListIterator< glm::vec4 > iVertices( *mVertices );

        const size_t size = mVertices->size();

        float** verts = new float*[ size ];

        size_t i = 0;

        glEnableClientState( GL_VERTEX_ARRAY );

        while( iVertices.hasNext() )
        {
            verts[ i ] = new float[ size ];
            verts[ i ] = const_cast< float* >( glm::value_ptr( iVertices.next() ) );

            glVertexPointer( 4, GL_FLOAT, 0, verts[ i ] );

            glDrawArrays( GL_LINES, 0, 4 );

            ++i;
        }

        glDisableClientState( GL_VERTEX_ARRAY );

        for( unsigned iMem = 0; iMem < size; ++iMem )
        {
            delete[] verts[ iMem ];
            verts[ iMem ] = NULL;
        }

        delete[] verts;
        verts = NULL;
    }
Run Code Online (Sandbox Code Playgroud)

FileUtility

    QString FileUtility::readShader( QString filepath )
    {
        std::ifstream in( filepath.toStdString().c_str() );
        std::stringstream shaderDat;

        shaderDat << in.rdbuf();

        QString shaderFile;

        shaderFile += shaderDat.str().c_str();

        in.close();

        return shaderFile;
    }
Run Code Online (Sandbox Code Playgroud)

GenericColor.frag

#version 330

out vec4 outputColor;

void main()
{
    outputColor = vec4(1.0f, 0, 0, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

Position.vert

#version 330

layout(location = 0) in vec4 position;

void main()
{
    gl_Position = position;
}
Run Code Online (Sandbox Code Playgroud)

更新

由于我的着色器绑定/编译代码被请求,我想我也可以发布我的整个着色器处理程序,以及引擎类.

- 引擎 - ShaderHandler.

更新

以下是解析的着色器字符串(Info是调试输出):

Info { 
    Shader Source #version 330

in uniform mvp;

layout(location = 0) in vec4 position;

void main()
{
    gl_ModelViewProjectionMatrix = mvp;
    gl_Position = position;
}




 };



Info { 
    Shader Source #version 330

out vec4 outputColor;

void main()
{
    outputColor = vec4(1.0f, 0, 0, 1.0f);
}


 };
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 19

该错误消息表示着色器编译器在着色器的第一行上看到垃圾字符(除了可打印的ASCII字符,空格,制表符或换行符之外的其他字符).这很可能意味着您传递给的字符串glShaderSource是垃圾 - 可能是一个悬挂指针,曾经指向您的着色器代码,但由于某些东西被破坏而不再存在.

编辑

我从你的链接看到你的代码看起来像:

s.Source = shader.toStdString().c_str();
Run Code Online (Sandbox Code Playgroud)

这将s.Source指向一个临时std::string对象的内部缓冲区,该临时对象将在此行之后不久被销毁,留下s.Source一个悬空指针......