透明な.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);
};
surfaceとsurface-> formatがNULLポインタでないことを確認します。 –
NULLを返しました。 SDL_Surfaceのどれもnullを返さず、非透明なものも返しません。 – Ripspace
これは、この関数ではなく、呼び出しコードに問題があることを意味します。 –