12

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

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

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

来自调试输出

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

更新

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

-引擎 - 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

5 回答 5

23

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

编辑

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

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

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

于 2012-06-04T22:50:21.553 回答
2

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

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

尝试更改 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有点不同-

于 2012-06-04T07:30:20.060 回答
1

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

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

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

于 2012-06-04T07:48:25.027 回答
1

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

于 2014-12-10T18:27:18.520 回答
0

我在标准 C 中遇到了这个错误,因为忘记将NUL( ) 终止符放在我正在读取字符\0的 'd 内存的末尾。malloc

我怀疑 GL 寻找空终止字符以便在glLinkProgram()(glew)期间链接着色器。

如果您不将const GLint *length参数传递给glLinkProgram() 它,则假定为 NUL 终止。因此错误。感谢derhass指出这一点。

于 2021-12-12T20:47:56.783 回答