2

SDL_LoadBMPは、ビットマップを上下逆にロードし、OpenGLにミラーリングします。何が問題なのか?

unsigned int loadTexture (const char * fileName)
{
    unsigned int texId;
    GLenum format;
    GLint colorCount;

    SDL_Surface * image = SDL_LoadBMP (fileName);

    colorCount = image->format->BytesPerPixel;
    if (colorCount == 4)
    {
         if (image->format->Rmask == 0x000000ff)
             format = GL_RGBA;
         else
             format = GL_BGRA;
    }
    else if (colorCount == 3)
    {
         if (image->format->Rmask == 0x000000ff)
             format = GL_RGB;
         else
             format = GL_BGR;
    }

    glGenTextures(1, &texId);
    glBindTexture(GL_TEXTURE_2D, texId);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, colorCount, image->w, image->h, 0, format, GL_UNSIGNED_BYTE, image->pixels);

    SDL_FreeSurface(image);
    return texId;
}

..これは私がテストクワッドを描く方法です。

glBegin(GL_QUADS);
    glTexCoord2i(0, 0); glVertex3f(-1.0, -1.0, 0.0);
    glTexCoord2i(1, 0); glVertex3f( 1.0, -1.0, 0.0);
    glTexCoord2i(1, 1); glVertex3f( 1.0,  1.0, 0.0);
    glTexCoord2i(0, 1); glVertex3f(-1.0,  1.0, 0.0);
glEnd();
4

1 に答える 1

1

OpenGLは常に、テクスチャ画像の原点が「左下」にあると想定します。

厳密に言えば、OpenGLは、テクスチャのデータが原点から始まり、テクスチャ座標の増加に伴って進行すると想定しています。したがって、テクスチャ座標が右上に投影されたテクスチャを描画すると、画像の原点は左下になります。

OpenGL側でこの動作を変更する方法はないため、ロードされた画像データを適切に調整するか、シェーダーのトリックを使用して方向を反転する必要があります。ただし、ほとんどの画像読み込みライブラリでは、期待する原点を選択できるため、これを左下に設定します。次に、ライブラリはデータを内部で調整します。

于 2012-07-16T06:39:18.883 に答える