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

新手上路,请多包涵

我看到了 这个 问题,它确实揭示了一些启示。尽管如此,我似乎无法弄清楚我是如何“不正确地”加载我的着色器的,因为它之前 已经 执行过,而最近没有对着色器加载代码进行任何更改,所以我认为这些错误一定来自我的绘图调用。

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

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

( _来自调试输出_)

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

文件实用程序

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

通用颜色.frag

 #version 330

out vec4 outputColor;

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

位置.vert

 #version 330

layout(location = 0) in vec4 position;

void main()
{
    gl_Position = position;
}

更新

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

更新

以下是解析的着色器字符串( 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);
}

 };

原文由 zeboidlund 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

编辑

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

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

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

原文由 Chris Dodd 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 Viktor Latypov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题