OpenGL 3 — FreeGmage Загрузка PNG с прозрачностью Переполнение стека

Я загрузил изображение PNG в мою сцену. Хотя само изображение загружается правильно (что я хочу отображать), проблема у меня заключается в прозрачности вокруг изображения. Там, где должна быть прозрачность, есть белые и черные пятна, заполняющие это пространство.

void Renderer::loadTexture()
{
const char textName[64] = ".\\foo.png";

FIBITMAP *dib = FreeImage_Load(FIF_PNG, textName, PNG_DEFAULT);
dib = FreeImage_ConvertTo24Bits(dib);if (FreeImage_GetBPP(dib) != 32)
{
FIBITMAP* tempImage = dib;
dib = FreeImage_ConvertTo32Bits(tempImage);
}

if (dib != NULL)
{
glGenTextures(1, &g_textureID);
glBindTexture(GL_TEXTURE_2D, g_textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

BYTE *bits = new BYTE[FreeImage_GetWidth(dib) * FreeImage_GetHeight(dib) * 4];

BYTE *pixels = (BYTE*) FreeImage_GetBits(dib);

for (int pix = 0; pix<FreeImage_GetWidth(dib) * FreeImage_GetHeight(dib); pix++)
{
bits[pix * 4 + 0] = pixels[pix * 4 + 2];
bits[pix * 4 + 1] = pixels[pix * 4 + 1];
bits[pix * 4 + 2] = pixels[pix * 4 + 0];
}

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), 0,
GL_RGBA, GL_UNSIGNED_BYTE, bits);

cout << textName << " loaded." << endl;

FreeImage_Unload(dib);
delete bits;
}}

1

Решение

Во-первых, у GL_RGBA есть один байт для каждого из красного, зеленого, синего и альфа (альфа = прозрачность). Ваш код, очевидно, не имел дело с альфа (4-й байт пикселя). Попробуйте добавить следующую строку:

    for (int pix = 0; pix<FreeImage_GetWidth(dib) * FreeImage_GetHeight(dib); pix++)
{
bits[pix * 4 + 0] = pixels[pix * 4 + 2];
bits[pix * 4 + 1] = pixels[pix * 4 + 1];
bits[pix * 4 + 2] = pixels[pix * 4 + 0];
bits[pix * 4 + 3] = pixels[pix * 4 + 3]; // Add this line to copy Alpha
}

Во-вторых, если это все еще не работает, попробуйте удалить FreeImage_ConvertTo24Bits строка (даже если это работает, пожалуйста, попробуйте удалить это):

// dib = FreeImage_ConvertTo24Bits(dib); // Remove this line
if (FreeImage_GetBPP(dib) != 32)
{
FIBITMAP* tempImage = dib;
dib = FreeImage_ConvertTo32Bits(tempImage);
}

Странно преобразовывать изображение в 24 бита, а затем обратно в 32 бита. Может быть, он откажется от альфа-канала.

Я не пытался запустить всю программу и отладить ее. Просто предоставлю несколько советов, которые вы можете попробовать.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]