1

SDL_Surface をロードして OpenGL テクスチャとして保存するスクリプトがあります。

typedef GLuint texture;

texture load_texture(std::string fname){
    SDL_Surface *tex_surf = IMG_Load(fname.c_str());
    if(!tex_surf){
        return 0;
    }
    texture ret;
    glGenTextures(1, &ret);
    glBindTexture(GL_TEXTURE_2D, ret);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    SDL_FreeSurface(tex_surf);
    return ret;
}

問題は、それが機能していないことです。メイン関数から関数を呼び出すと、画像が読み込まれず(表示時に描画色が変わるだけです)、メイン関数外の関数から呼び出すと、プログラムがクラッシュします。プログラムをクラッシュさせるのは次の行です。

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

誰でもこれで間違いを見ることができますか?

4

4 に答える 4

2

私の賭けは、SDL_Surface を OpenGL テクスチャに詰め込もうとする前に変換する必要があるということです。一般的なアイデアを提供する必要があるものを次に示します。

SDL_Surface* originalSurface; // Load like an other SDL_Surface

int w = pow(2, ceil( log(originalSurface->w)/log(2) ) ); // Round up to the nearest power of two

SDL_Surface* newSurface = 
  SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0);
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface

texture ret;

glGenTextures( 1, &ret );
glBindTexture( GL_TEXTURE_2D, ret );
glTexImage2D( GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB,
          GL_UNSIGNED_BYTE, newSurface->pixels );

元のコードはこちらで見つかりましたGameDev に関するその他の有益な投稿もあるかもしれません。

于 2009-05-04T18:33:32.920 に答える