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

时间:2012-06-04 06:53:58

标签: c++ opengl error-handling compilation glsl

我看到了this的问题,这确实让人感到轻松。尽管如此,我似乎无法弄清楚我是如何“不正确地”加载我的着色器,因为这个已经执行了而没有对着色器加载代码进行任何最近的更改,所以我认为这些错误必须来自我的平局电话。

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

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

来自调试输出

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>"

 };

绘制代码

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

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

GenericColor.frag

#version 330

out vec4 outputColor;

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

Position.vert

#version 330

layout(location = 0) in vec4 position;

void main()
{
    gl_Position = position;
}

更新

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

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


 };

4 个答案:

答案 0 :(得分:19)

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

修改

我从您的链接中看到您的代码如下:

s.Source = shader.toStdString().c_str();

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

答案 1 :(得分:2)

我的猜测:我已经在你的代码中看到了glLoadMatrix()调用,这基本上意味着你正在使用过时的(3.1之前的)GL API并且没有正确初始化GL3.1核心配置文件上下文。

这会导致您的上下文不支持GLSL1.50 +和“location”属性(因此来自着色器编译器的错误)。

尝试更改GL的初始化,然后检查glBindAttribLocation来电。避免使用glLoadMatrix的东西 - 改为使用着色器制服。

查看opengl.org的网站:http://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_(C%2B%2B/Win)以获取GL 3.1上下文创建示例。它与GL2.0略有不同 -

答案 2 :(得分:1)

这可能与您当前的问题无关,但很快就会出现问题:

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

第一行中分配的内存被泄露,此外,当您在几行之后调用delete时,您将删除new给出的值,但是已经删除了该值。这是你的意思吗?

答案 3 :(得分:1)

我收到此错误是因为我剪切了,并从网站粘贴了一些着色器代码。我认为LF / CR的差异导致了这个问题。使用手动输入的相同代码删除粘贴的文本。