2012-03-08 17 views
1

透明な.png SDL_SurfaceをOpenGLテクスチャに変換しようとすると、プログラムがSDL_Surfaceのデータにアクセスしようとするとクラッシュします。私は透明なpngを含む他の人のコードを観察しましたが、他の質問者によると同じであり、クラッシュしません。これは私のコードで、プログラムがクラッシュする部分です。それは "n0fColors = surface-> format-> BytesPerPixel"でクラッシュします。透明なpngを変換するSDL/OpenGLがクラッシュする

GLuint CONVERT_IMAGE(SDL_Surface * surface) 
{ 
    GLuint texture; 
    GLenum texture_format; 
    GLint nOfColors; 

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

    glGenTextures(1, &texture); 

glBindTexture(GL_TEXTURE_2D, texture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels); 

    delete surface; 
    return texture; 
}; 

編集:PNGの透明部分は透明であることに注意してください。 EDIT:これは私のイメージに私の呼び出しです:

void image_init() 
{ 
    wall_clay_0 = IMG_Load("images/walls/clay.png"); 

    walls_image.clay = CONVERT_IMAGE(wall_clay_0); 
}; 
+0

surfaceとsurface-> formatがNULLポインタでないことを確認します。 –

+0

NULLを返しました。 SDL_Surfaceのどれもnullを返さず、非透明なものも返しません。 – Ripspace

+1

これは、この関数ではなく、呼び出しコードに問題があることを意味します。 –

答えて

0

私はそれを考え出しました。ロードしたすべてのイメージを一時的なサーフェスにして、それ自身のSDL_DisplayFormatAlphaと同じにする必要がありました。例:

SDL_Surface * surface; 
surface = IMG_Load(bla.png); 
surface = SDL_DisplayFormatAlpha(surface); 
0

あなたのローディングコードは次のようにする必要があります:

void image_init() 
{ 
    wall_clay_0 = IMG_Load("images/walls/clay.png"); 
    if (!wall_clay_0) 
    { 
     printf("Error loading mage: %s\n", IMG_GetError()); 
     abort(); // or whatever your application should do 
    } 
    walls_image.clay = CONVERT_IMAGE(wall_clay_0); 
} 
+0

私はエラーチェックを求めていません。 – Ripspace

+0

さて、私はあなたが表面がNULLだと理解しました。何が何であるかをより具体的にする。 –

+0

サーフェスは正常にロードされ、nullではありませんが、surface-> formatはNULLです。 – Ripspace

関連する問題