6

私のプログラムの目的は、2つの異なるテクスチャを持つ2つのクワッドを表示することです。問題は、ロードされた最も古いテクスチャが2つのクワッド(texQuadBのみ)に設定されていることです。buf [3]の2つの呼び出しをtexQuadAとtexQuadBに置き換えようとしましたが、機能しません。テクスチャを特定のVBOにバインドする正しい方法が見つかりません。

#define OFFSET_BUFFER(bytes) ((GLfloat *)NULL + bytes)

GLfloat verticesQuadA[12] =
{
    -1.0f, 0.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
};

GLfloat verticesQuadB[12] =
{
    0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 0.0f, 1.0f,
};

GLfloat colors[12] =
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 1.0f,
};

GLfloat texture[8] =
{
    0.0f, 0.0f,
    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 1.0f
};

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Texture Mapping",NULL);
    SDL_SetVideoMode(500, 500, 32, SDL_OPENGL);

    bool continuer = true;
    SDL_Event event;
    GLuint  buf[4];
    GLuint texQuadA, texQuadB;

    glClearDepth(1.0f);
    glClearColor(0.1f, 0.1f, 0.1f, 0.1f);
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(70.0f, (float)500.0f / (float)500.0f, 1.0f, 3000.0f);
    glewInit();

    texQuadA = loadTexture("caisse.jpg");
    texQuadB = loadTexture("metal.jpg");

    //glBindTexture(GL_TEXTURE_2D, texQuadA);
    //glBindTexture(GL_TEXTURE_2D, texQuadB);

    glGenBuffers(4, buf);

    glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesQuadA), verticesQuadA, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, buf[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesQuadB), verticesQuadB, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, buf[2]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, buf[3]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(texture), texture, GL_STATIC_DRAW);

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = false;
        }

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glEnable(GL_TEXTURE_2D);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

        //Draw Quad A ---------------------------------------

        glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
        glVertexPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glBindBuffer(GL_ARRAY_BUFFER, buf[2]);
        glColorPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glBindBuffer(GL_ARRAY_BUFFER, buf[3]);
        glTexCoordPointer(2, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glDrawArrays(GL_QUADS, 0, 4);

        glDisableClientState(GL_TEXTURE_COORD_ARRAY);   
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        //Draw Quad B ---------------------------------------

        glBindBuffer(GL_ARRAY_BUFFER, buf[1]);
        glVertexPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glBindBuffer(GL_ARRAY_BUFFER, buf[2]);
        glColorPointer(3, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glBindBuffer(GL_ARRAY_BUFFER, buf[3]);
        glTexCoordPointer(2, GL_FLOAT, 0, OFFSET_BUFFER(0));

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glDrawArrays(GL_QUADS, 0, 4);

        glDisableClientState(GL_TEXTURE_COORD_ARRAY);   
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        //----------------------------------------------------

        glFlush();
        SDL_GL_SwapBuffers();
    }
    glDeleteBuffers(3, buf);
    glDisable(GL_TEXTURE_2D);
    SDL_Quit();

    return 0;
}
4

2 に答える 2

8

OpenGL はステート マシンです。テクスチャをバインドすると、その状態の一部が設定されます。テクスチャが有効な場合、OpenGL はジオメトリを描画するときに現在のテクスチャ状態 (最後にバインドしたテクスチャ) を使用します。Quad A を描画する前に、texQuadA をバインドします。Quad B を描画する前に、texQuadB をバインドします。

glBindTexture(GL_TEXTURE_2D, texQuadA);
// Draw Quad A

glBindTexture(GL_TEXTURE_2D, texQuadB);
// Draw Quad B

この場合、VBO は無関係です。

于 2012-04-30T15:05:12.567 に答える
2

VBO はテクスチャ オブジェクトと相互作用しません。VBO をバインドしても、テクスチャに関連付けられません。

描画に使用するテクスチャを選択するには、それを使用して描画コマンドを実行する前に glBindTexture を呼び出します。

于 2012-04-30T15:07:02.403 に答える