Как исправить: черные мерцающие спрайты (opengl + sdl) - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть пара спрайтов для загрузки, которая может привести к ошибке:

Исключение, выданное в 0x7AF40CFE (nvoglv32.dll) в some.exe: 0xC0000005: Местоположение чтения нарушения доступа 0x0BA80000.

Иногда по какой-то причине они загружаются, но отображаются так:


Все эти спрайты хорошо открываются в других приложениях, поэтомуЯ не думаю, что проблема в том, что они сломаны.

Вот мой код загрузки изображения:

SDL_Surface* image = IMG_Load(fileName);

if (image == nullptr)
{
    return false;
}

_width = static_cast<float>(image->w);
_height = static_cast<float>(image->h);

int mode = GL_RGB;

if (image->format->BytesPerPixel == 4)
{
    mode = GL_RGBA;
}

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

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

glTexImage2D( // ERROR HERE
   GL_TEXTURE_2D,
   0,
   mode,
   static_cast<GLsizei>(_width),
   static_cast<GLsizei>(_height),
   0,
   mode,
   GL_UNSIGNED_BYTE,
   image->pixels);

SDL_FreeSurface(image);

return true;

Рендеринг:

UseShader();
glBindVertexArray(_VAO);
glBindTexture(GL_TEXTURE_2D, _sprite_ID);
glDrawArrays(GL_TRIANGLES, 0, 6);
glUseProgram(0);

ФайлФормат: PNG

и

Я установил 32 байта на пиксель:

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
...