0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
1

Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом

06.12.2016, 15:05. Показов 2867. Ответов 30

Студворк — интернет-сервис помощи студентам
Добрый день. Изучаю возможности добавление текстуры с прозрачностью. Конкретно, пытаюсь добавить текстуру на квадрат.
Описываю так.
C++
1
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_MeteorM->sizeX, texture_MeteorM->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_MeteorM->data);
При этом всё получается, но остаётся белый фон.
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом


Пытаюсь убрать его. Делаю так: (остальное оставляю как есть)
C++
1
 glTexImage2D(GL_TEXTURE_2D, 0, 4, texture_MeteorM->sizeX, texture_MeteorM->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_MeteorM->data);
Получаю плохо результат
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом

Если можно, объясните что не так. спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2016, 15:05
Ответы с готовыми решениями:

Как пользоваться альфа каналом bmp
Загружаю изображение с альфа каналом P1 = new Graphics::TBitmap; P1->LoadFromFile("p1.bmp"); А...

Натянуть текстуру с альфа каналом на прозрачный примитив
Все те же чертовы квадраты))) В чем задача: Имеется текстура в бмп формате 32 бита с альфой 16х16...

Какой программой можно видео с альфа каналом - превратить в гиф с альфа-каналом?
Здравствуйте. Помогите советом. Какой программой можно видео с альфа каналом (с прозрачным...

Graphics: как рисовать Альфа каналом
собственно вопрос такой как рисовать именно прозрочностью то есть например я кистью нарисовал...

30
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
06.12.2016, 15:14  [ТС] 2
Конкретно рисую вот так:
C++
1
2
3
4
5
6
7
8
9
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
  glTexCoord2f(0.0f, 0.0f); glVertex3f(0,-15,-15);
  glTexCoord2f(1.0f, 0.0f); glVertex3f(0,-15,15);
  glTexCoord2f(1.0f, 1.0f); glVertex3f(0,15,15);
  glTexCoord2f(0.0f, 1.0f); glVertex3f(0,15,-15);
glEnd();
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
06.12.2016, 17:24 3
spiderman23, сам bmp НЕ содержит альфа-канал. Его нужно добавить в файл с помощью редактора(Photoshop например, можно добавить слой Alpha) и сохранить его именно как 32bit
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
06.12.2016, 17:30  [ТС] 4
snake32, я так и сделал. в фотошопе bmp с альфа каналом.
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
06.12.2016, 17:33  [ТС] 5
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом

вот так сохраняю
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
06.12.2016, 18:02 6
Значит ф-ия которая загружает bmp не понимает RGBA. И загружает их как RGB, потому как на результате чётко видно что не хватает 1/4 данных

Добавлено через 1 минуту
то есть массив texture_MeteorM->data должен содержать width*height*4 байт
1
Фриланс Pascal/Delphi etc
64 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
06.12.2016, 18:11 7
spiderman23

Попробуйте, выставить режим смешивания Alpha:

C++ (Qt)
1
2
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 10:05  [ТС] 8
snake32,
Функция, которая загружает bmp такая:
C++
1
texture_MeteorM=auxDIBImageLoad(L"2.bmp");
Соответственно вопрос следующий. Как узнать, сколько байт содержит массив texture_MeteorM->data.
Если я пишу sizeof(texture_MeteorM->data) возвращает ответ 4 (это как я понимаю просто размер переменной texture_MeteorM, которая описана AUX_RGBImageRec *texture_MeteorM; так.
И возможно, знаете, как использовать что-то другое для загрузки bmp. И как загрузить png?
ILinker,
Цитата Сообщение от ILinker Посмотреть сообщение
Попробуйте, выставить режим смешивания Alpha:
C++ (Qt)Выделить код
1
2
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Это не помогло. Как бы, смешивание работает, но сама картинка остаётся как раньше, как сказал snake32 "не хватает 1/4 данных". Видимо проблема как раз в той функции.
0
Фриланс Pascal/Delphi etc
64 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
07.12.2016, 10:16 9
Может пройтись по пикселям и выставить Alpha в 0 где нужно?
Ещё как вариант сделать Premult Alpha.

Может PNG загрузить?
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 10:20  [ТС] 10
ILinker, у меня есть и png. Как его грузить? Та функция не может. png вот такой
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом
0
142 / 86 / 23
Регистрация: 31.08.2016
Сообщений: 748
07.12.2016, 10:35 11
маскирование
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 10:38  [ТС] 12
Нашел сообщение о том, что моя функция действительно не может грузить BMP 32 бит. Спасибо snake32.
Как сделать цвет полигона прозрачным
Буду искать решение дальше. Приму в дар ссылки на что-то похожее
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
07.12.2016, 16:51 13
как вариант DevIL
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 16:52  [ТС] 14
Okay. Читать BMP32 вроде как научился. Теперь такой результат
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом

Есть идеи?
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
07.12.2016, 16:55 15
Параметры glTexImage2D покажите

Добавлено через 1 минуту
glTexImage2D(GL_TEXTURE_2D, 0, 4, texture_MeteorM->sizeX, texture_MeteorM->sizeY, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture_MeteorM->data);
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 16:59  [ТС] 16
Параметры:
C++
1
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1000, 1000, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
что такое data:
C++
1
2
3
4
5
6
7
unsigned char *data;
  String filename="2.bmp";
  FILE *file;
  file = fopen(filename, "rb");
  data = (unsigned char*) malloc(1000 * 1000 * 4);
 fread(data, 1000 * 1000 * 4, 1, file);
  fclose(file);
как рисую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glEnable(GL_ALPHA_TEST); //разрешаем альфа-тест
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, texture[1]);
  glBegin(GL_QUADS);
          glTexCoord2f(0.0f, 0.0f); glVertex3f(0,-15,-15);
          glTexCoord2f(1.0f, 0.0f); glVertex3f(0,-15,15);
          glTexCoord2f(1.0f, 1.0f); glVertex3f(0,15,15);
          glTexCoord2f(0.0f, 1.0f); glVertex3f(0,15,-15);
  glEnd();
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
Добавлено через 1 минуту
Если пишу
Цитата Сообщение от snake32 Посмотреть сообщение
GL_BGRA
то мне пишет
[BCC32 Error] Earth3D.cpp(124): E2451 Undefined symbol 'GL_BGRA'
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
07.12.2016, 17:02 17
C++
1
GL_BGRA = 0x80E1;
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 17:03  [ТС] 18
Цитата Сообщение от snake32 Посмотреть сообщение
GL_BGRA = 0x80E1;
Так (если заменить GL_BGRA на вот это) работает (не выдаёт ошибку), но результат как и был.
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 58
07.12.2016, 17:19  [ТС] 19
Ничего не менял, кроме
C++
1
glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
Стало:
Как добавить прозрачность на текстуру, используя BMP 32 с альфа каналом
0
3316 / 1490 / 235
Регистрация: 26.02.2009
Сообщений: 7,590
Записей в блоге: 5
07.12.2016, 18:11 20
C++
1
2
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2016, 18:11
Помогаю со студенческими работами здесь

Как загрузить картинку с альфа каналом?
Мне нужно загружать изображение с альфа каналом и рисовать это изображение поверх другого, в...

Как удалить слой, или управлять альфа-каналом мувика в определённых кадрах?
Добрый день. Говорят, что это возможно, но я не знаю как. Итак, у меня такая задача: есть мувик, в...

QPixmap с альфа-каналом
Помогите пожалуйста. Есть окно (400 на 400 пикселей). Хочу применить к нему setMask(QPixmap). Но...

Текстура с альфа каналом
Всем доброго времени суток. Возникла проблема с наложением текстуры с альфа-каналом на примитив....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru