2

質問の長さについてお詫びすることから始めます。私はいくつかの小さな、ばかげたエラーを犯したと思いますが、それを完全に見つけることができないので、念のために関連するすべてのコードを投稿することにしました。

ついにQImageを使用してテクスチャの読み込みが機能するようになり、テクスチャを即時モードでレンダリングできるようになりました。ただし、頂点配列は機能せず、その理由がわかりません。「頂点配列とテクスチャ座標配列を有効にしましたか?」のような最も明白なこと おそらく答えではありません。初期化コードを投稿します。

init関数は次のとおりです。

    /* general OpenGL initialization function */
    int initGL()
    {

        glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
        glClearColor(0, 0, 0, 1);               // Black Background
        glEnable ( GL_COLOR_MATERIAL );
        glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );


        glDisable(GL_DEPTH_TEST);


//ENABLED VERTEX ARRAYS AND TEXTURE COORDINATE ARRAYS       
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);

//ENABLED 2D TEXTURING
        glEnable ( GL_TEXTURE_2D );
        glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );

        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

//seed random
        srand(time(NULL));


        return( TRUE );
    }

QGLWidgetによって呼び出される初期化、サイズ変更、および描画関数があります(それ自体が実際の仕事関数を呼び出す単なるスケルトンです)

テクスチャ読み込み機能:

GLuint LoadGLTextures( const char * name )
 {
     //unformatted QImage
     QImage img;
     //load the image from a .qrc resource
     if(!img.load(":/star.bmp"))
     {
         qWarning("ERROR LOADING IMAGE");
     }

     //an OpenGL formatted QImage
     QImage GL_formatted_image;
     GL_formatted_image = QGLWidget::convertToGLFormat(img);

     //error check
     if(GL_formatted_image.isNull())
         qWarning("IMAGE IS NULL");
     else
         qWarning("IMAGE NOT NULL");


     //texture ID
     GLuint _textures[1];


     //enable texturing
     glEnable(GL_TEXTURE_2D);
     //generate textures
     glGenTextures(1,&_textures[0]);
     //bind the texture
     glBindTexture(GL_TEXTURE_2D,_textures[0]);
     //texture parameters
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     glBindTexture(GL_TEXTURE_2D,_textures[0]);
     //generate texture
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_formatted_image.width(),
                  GL_formatted_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
                  GL_formatted_image.bits());




     glBindTexture(GL_TEXTURE_2D,_textures[0]);

     //return the texture ID
     return _textures[0];
}

描画コードは次のとおりです。

//this does draw

//get the texture ID
    GLuint tex_id = LoadGLTextures(":/star.png");

        glBindTexture(GL_TEXTURE_2D, tex_id); // Actually have an array of images



        glColor3f(1.0f, 0.0f, 0.5f);
        glBegin(GL_QUADS);
            glTexCoord2f(1.0f, 0.0f);glVertex2f(1.0f, 0.0f);
            glTexCoord2f(1.0f, 1.0f);glVertex2f(1.0f, 1.0f);
            glTexCoord2f(0.0f, 1.0f);glVertex2f(0.0f, 1.0f);
            glTexCoord2f(0.0f, 0.0f);glVertex2f(0.0f, 0.0f);
        glEnd();


//this does not draw

        //translations code
        glLoadIdentity();
        glTranslatef(-1.0f, 0.0f, 0.0f);
        //bind the texture
        glBindTexture(GL_TEXTURE_2D, tex_id);
        //set color state
        glColor4f(0.0f, 1.0f, 0.0f, 0.5);

        //vertices to be rendered
        static GLfloat vertices[] =
        {
            1.0f, 0.0f,
            1.0f, 1.0f,
            0.0f, 1.0f,
            0.0f, 0.0f

        };

        static GLshort coord_Data[] =
        {
        1, 0,
        1, 1,
        0, 1,
        0, 0


        };

        //bind the texture
        glBindTexture(GL_TEXTURE_2D, tex_id);
        //pointer to the vertex array
        glVertexPointer(2, GL_FLOAT, 0, vertices);
        //texture coordinate pointer
        glTexCoordPointer(2, GL_SHORT, 0, coord_Data);

        //draw the arrays
        glDrawArrays(GL_QUADS, 0, 4);

助けてくれてありがとう、Dragonwrenn

4

2 に答える 2

2

1つの可能性は、問題がglTexCoordPointerを呼び出す前にglVertexCoordPointerを呼び出すことに起因することです。頂点座標の後にテクスチャ座標を指定すると、奇妙なことが起こります。これは、テクスチャ座標を使用して単一の頂点を描画する場合に当てはまります。それが配列に当てはまるかどうかはわかりません。

他のいくつかのこと...

QImageの代わりにQPixMapを使用してみましたか?テクスチャが最初のクワッドに適切に適用されているように聞こえるので、これがあなたの問題の答えではないかと思います。

bindTextureには2つの呼び出しがあります。

コードの2番目の部分で(テクスチャなしで)頂点を描画してみましたか?

最後に、コンパイラの警告が表示されますか?

于 2011-03-25T01:11:55.347 に答える
0

OpenGLの状態操作を配置する方法では、物事を追跡することは困難です。OpenGLの状態をオンデマンドで設定することをお勧めします。それで

これを動かす

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_CORRD_ARRAY);

直前

    //bind the texture
    glBindTexture(GL_TEXTURE_2D, tex_id);
    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_SHORT, 0, coord_Data);

    //draw the arrays
    glDrawArrays(GL_QUADS, 0, 4);

また、他のコードをから移動する必要がありますinitGL

glTexImageにデータを提供する前に、テクスチャローダーに属します。

glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );

描画機能の先頭に属する:

glShadeModel(GL_SMOOTH);
glClearColor(0, 0, 0, 1);
glEnable( GL_COLOR_MATERIAL );
glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );

glDisable(GL_DEPTH_TEST);

スキームに従って、描画関数でもビューポートと投影行列を設定する必要があります。チュートリアルのほとんどはそれを異なって行うので、私はこれを言っているだけです。それは人々をだましてこれが正しい方法であると思わせます。技術的には、プロジェクションとビューポート、およびオンデマンド状態も同様です。

描画を呼び出すたびにテクスチャを再ロードしないでください。描画ハンドラを介してオンデマンドでテクスチャを初期化することをお勧めします。参照されているテクスチャがOpenGLですでに使用可能である場合は、テクスチャカプセル化クラスにフラグを追加するだけで済みます。

デバッグの目的で、テクスチャ座標のタイプをfloatに変更してみてください。

于 2011-03-18T19:19:38.283 に答える