1

SDL_image を使用してイメージを OpenGL テクスチャにロードしようとすると、予期しない出力が表示されます。

私のコードの関連部分は次のとおりです。

/**
 * Load texture
 * @param {char*} [filename] File name to load
 * @param {int*} [textw] Texture width pointer (value returned)
 * @param {int*} [texth] Texture height pointer (value returned)
 * @return {GLuint}
 * @link http://sdl.beuc.net/sdl.wiki/OpenGL_Texture_Example
 **/
GLuint LoadTexture(char *filename, int *textw, int *texth) {

    GLuint textureid;
    int mode;

    SDL_Surface *surface = IMG_Load(filename);

    // could not load filename
    if (!surface) {
        return 0;
    }

    // work out what format to tell glTexImage2D to use...
    if (surface->format->BytesPerPixel == 3) { // RGB 24bit
        mode = GL_RGB;
        printf( "GL_RGB\n" );
    } else if (surface->format->BytesPerPixel == 4) { // RGBA 32bit
        mode = GL_RGBA;
        printf( "GL_RGBA\n" );
    } else {
        SDL_FreeSurface(surface);
        return 0;
    }

    // Record texture dimensions
    *textw = surface->w;
    *texth = surface->h;

    // create one texture name
    glGenTextures(1, &textureid);

    // tell opengl to use the generated texture name
    glBindTexture(GL_TEXTURE_2D, textureid);

    // this reads from the sdl surface and puts it into an opengl texture
    glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels);

    // these affect how this texture is drawn later on...
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // clean up
    SDL_FreeSurface(surface);

    return textureid;

}

/**
 * Render
 * @param {GLuint} [textureid] OpenGL texture to apply
 **/
void render( textureid ) {

    //Clear color buffer
    glClear( GL_COLOR_BUFFER_BIT );

    //Render quad
    if ( gRenderQuad ) {

        // Set color
        glColor3f(0.0f,1.0f,0.0f); 

        // tell opengl to use the generated texture name
        glBindTexture(GL_TEXTURE_2D, textureid);
        glEnable(GL_TEXTURE_2D);

        // Draw rectangle
        glBegin( GL_QUADS );

        // Top left
        glTexCoord2i(0, 1);
        glVertex2f( -1.0f, -1.0f );

        // Top right
        glTexCoord2i(1, 1);
        glVertex2f( 1.0f, -1.0f );

        // Bottom left
        glTexCoord2i(1, 0);
        glVertex2f( 1.0f, 1.0f );

        // Bottom right
        glTexCoord2i(0, 0);
        glVertex2f( -1.0f, 1.0f );

        glEnd();

        glDisable(GL_TEXTURE_2D );

    }

}

私がロードするネイティブ画像は次のとおりです。

入力.jpg

しかし、出力は次のとおりです。

出力.jpg

別のスタック オーバーフローの投稿で読んだことから、逆チャネルの問題である可能性があると思いますが、提案された解決策では問題が解決しません。私のアプローチ/コードの何が問題になっていますか?

4

1 に答える 1