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

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

アップデート

シェーダーバインディング/コンパイルコードが要求されたので、シェーダーハンドラー全体とエンジンクラスを投稿するだけでもよいと思いました。

-エンジン-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::strings.Source

于 2012-06-04T22:50:21.553 に答える
2

私の推測: コードで glLoadMatrix() 呼び出しを見てきました。これは基本的に、古い (3.1 より前の) GL API を使用しており、GL3.1 コア プロファイル コンテキストを正しく初期化していないことを意味します。

これにより、コンテキストが GLSL1.50+ および「場所」属性をサポートしていない状況が発生します (したがって、シェーダー コンパイラからのエラー)。

GL の初期化を変更してから、glBindAttribLocation呼び出しを確認してください。glLoadMatrix の使用を避け、代わりにシェーダー ユニフォームを使用してください。

GL 3.1 コンテキスト作成サンプルについては、opengl.org のサイト ( http://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_(C%2B%2B/Win )) を参照してください。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 に答える