Проблемы с загрузкой 32-битной текстуры .bmp в opengl Переполнение стека

У меня возникли проблемы с загрузкой 32-битного изображения .bmp в моей игре opengl. До сих пор я могу загрузить и отобразить 24-битный отлично. Теперь я хочу загрузить небольшую карту с частями ее текстуры, которые будут прозрачными или невидимыми.

Эта функция не имеет проблем с 24 бит. но 32-битный с альфа-каналом .bmp, кажется, искажает цвета и вызывает прозрачность в непредусмотренных местах.

Texture LoadTexture( const char * filename, int width, int height, bool alpha)
{
GLuint texture;
GLuint* data;
FILE* file;

fopen_s(&file, filename, "rb");
if(!file)
{
std::cout << filename <<": Load Texture Fail!\n";
exit(0);
}

data = new GLuint[width * height];

fread( data, width * height * sizeof(GLuint), 1, file );
fclose(file);

glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

if(alpha) //for .bmp 32 bit
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
else //for .bmp 24 bit
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
}

std::cout<<"Texture: "<<filename<< " loaded"<<std::endl;
delete data;

return Texture(texture);
}

В игре текстуры, нарисованные на плоской плоскости
введите описание изображения здесь

это может выглядеть как его работа, но цвет 0xff00ff должен быть прозрачным. и если я переверну альфа-канал в фотошопе, результат будет тем же самым, инерная сфера всегда прозрачна.

я также включил:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

проблем с прозрачностью нет, похоже, проблемы с загрузкой растрового изображения с альфа-каналом. также все битовые карты, которые я загружаю, кажутся немного смещенными вправо. Просто интересно, была ли причина для этого?

2

Решение

Я собираюсь ответить на это, если предположить, что «синтаксический анализ» вашего файла на самом деле правильный. То, что данные файла — это просто часть изображения .BMP без какой-либо информации заголовка.

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);

Мне кажется любопытным, что ваши 3-компонентные данные находятся в BGR заказать, но ваши 4-компонентные данные находятся в RGBA порядок. Особенно, если эти данные поступают из файла .BMP (хотя они не допускают альфа-каналы). Вы уверены, что ваши данные не в другом порядке? Например, возможно ABGR порядок?

Также, прекратить использование чисел для форматов изображений. Вы должны использовать реальный, размера внутренний формат для ваших текстур, а не «3» или «4».

0

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

Так что код, который я использую для меня на 100%, скомпилирован Visual C 2012

glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(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);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //Thia is very important!!!!
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  imag_ptr,  ptr->image->height, 0,GL_RGBA, GL_UNSIGNED_BYTE, imag_ptr);

и чем в рендере я использую

glPushMatrix();
glTranslatef(0,0,0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 1);
glEnable(GL_BLEND);
glColor4ub(255,255,255,255);  //This is veryveryvery importent !!!!!!!!!!! (try to play and you see)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
glTexCoord3d(1,  1,  0);
glVertex2f(8,8);
glTexCoord3d(0,  1,  0);
glVertex2f(-8,8);
glTexCoord3d(0,  0,  0);
glVertex2f(-8,-8);
glTexCoord3d(1,  0,  0);
glVertex2f(8,-8);
glEnd();
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();

и я использую, например, значок Android Png и другой, я пытаюсь опубликовать другое изображение, но у меня нет peputation для этого, поэтому, если вы хотите, я отправляю его вам

Так что все это в формате PNG
но в формате bmp и tga вы должны поменять цвета с ARGB на RGBA без этого, это не работает

for( x=0;x<bmp_in_fheader.width;x++)
{
t=pixel[i];
t1=pixel[i+1];
t2=pixel[i+2];
t3=pixel[i+3];

pixel_temp[j]=t2;
pixel_temp[j+1]=t1;
pixel_temp[j+2]=t;
pixel_temp[j+3]=t3;

i+=4;
j+=4;
}

== Следующая ==
Чтобы создать их в фотошопе, вы должны удалить фон и нарисовать на новом слое, чем добавить альфа-слой
в каналах ПОМНИТЕ !! Очень важно, чтобы в альфе все черные цвета представляли прозрачность
и ваше изображение должно быть только под белым цветом

0