Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/17: Рейтинг темы: голосов - 17, средняя оценка - 4.65
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
1

Вывод битмапа

15.09.2009, 23:45. Просмотров 3083. Ответов 7
Метки нет (Все метки)

Пытаюсь разбраться с OpenGL - возникла пролема. Имеется битмап образец, из его частей динамически создаётся новый, каждый раз другой. Какой функцией лучше осуществлять вывод? Если можно, то хоть небольшой пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2009, 23:45
Ответы с готовыми решениями:

Вывод битмапа в TImage с определённой позиции
драсти! народ подскажите.. а как внутри Timage вывести картинку с...

Сохранение битмапа
Нужно сделать изображение (цвет каждого пикселя определяется случайно), и...

Загрузка Битмапа в форму
Перенес файлы проекта из начальной папки Projects на раб. стол. В отдельную...

Объединить в один 2 битмапа
Нужен по возможности наиболее простой способ решения следующей задачи Есть два...

Загрузка битмапа в консоль
Доброго времени суток. У меня такая проблемка: Надо загрузить битмап картинку...

7
snake32
1660 / 1114 / 195
Регистрация: 26.02.2009
Сообщений: 4,122
Записей в блоге: 5
16.09.2009, 00:59 2
Вывод цветного битмапа
C++
1
2
3
4
5
6
7
8
9
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluOrtho2D(viewport[0], viewport[2], viewport[1], viewport[3] ); // ортоганальная 2Д
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
 
    glRasterPos2i( position.x, position.y );// позиция растра (левый нижний угол картинки)
// glRasterPos2i( 0, 0 ); соответствует вывода растра в левом нижнем углу экрана(Viewport)
    glDrawPixels( width, height, GL_BGR, GL_UNSIGNED_BYTE, pdata );
где width, height - размеры изображения
pdata - собственно массив данных для вывода, тк формат GL_BGR и тип GL_UNSIGNED_BYTE, те 3 байта на пиксель, то объём массива = width * height * 3

ДА! и не забудьте указать упаковку пикселей после инициализации ГЛя
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
0
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
16.09.2009, 01:35  [ТС] 3
Спасибо, буду пробовать.
0
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
16.09.2009, 04:26  [ТС] 4
Что-то я торможу. Приведённый код получается нужен для вывода всей сцены, а мне нужно битмап наложить на уже подготовленную сцену. И пока у меня не выходит.

(Не выходит у Данилы каменная чаша)

Добавлено через 7 минут
По сути накладывается текст, составленный из оригинального битмапа.
0
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
17.09.2009, 13:28  [ТС] 5
Пытаюсь модифицировать готовый пример. На сцене вращаются объекты. Хочу вывести графический текст, но для начала пытаюсь вывести просто битмап - в итоге на экране прямоугольник с размером битмапа, заполненный мусором. Пересмотрел кучу примеров, но не нашёл ничего похожего.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function DrawGLScene : Boolean;
begin
  // Очистить сцену и буфер глубины
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
  glLoadIdentity;
 
  // Сброс просмотра
  glTranslatef(0.0, 0.0, -Settings.Distance);
  glRotatef(-rot, 1.0, 0.0, 0.0);
 
  glLightfv(GL_LIGHT0, GL_POSITION, @light_position);
  glLightfv(GL_LIGHT1, GL_POSITION, @light1_position);
  glLightfv(GL_LIGHT2, GL_POSITION, @light2_position);
  glLightfv(GL_LIGHT3, GL_POSITION, @light3_position);
  glLightfv(GL_LIGHT4, GL_POSITION, @light4_position);
  glLightfv(GL_LIGHT5, GL_POSITION, @light5_position);
  glLightfv(GL_LIGHT6, GL_POSITION, @light6_position);
 
  Delta := GetDeltaTime;
  Object1.Draw(Delta);
  glDisable(GL_LIGHTING);
    
  glRotatef(rot, 1.0, 0.0, 0.0);
    
  Object2.Draw(Delta);
 
  rot := rot + (Settings.K_ROT * Delta / 100.0);
 
  //-- моя добавка --
  // Пытаюсь вывести битмап - на экране мусор
  if (pImage <> NIL) and FullScreen then
  begin
    glRasterPos2i(0, 0); // позиция растра (левый нижний угол картинки)
    glDrawPixels(imgWidth, imgHeight, GL_RGB, GL_UNSIGNED_BYTE, @pImage);
  end;
 
  Result := True;
end;
// Старт программы
// Загружаем в Bmp JPG из ресурса с конвертацией в битмап
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
if LoadPictureFromResource(@IMGInfo, hInstance, MakeIntResource(IDB_NUMBER), Bmp) then
begin
  SelectObject(BmpDC, Bmp);
 
  GetMem(BI, SizeOf(TBitmapInfo));
  try
    FillChar(BI^, SizeOf(TBITMAPINFO), 0);
    with BI^.bmiHeader do
    begin
      biSize          := SizeOf(TBITMAPINFOHEADER);
      biWidth         := IMGInfo.pxWidth;
      biHeight        := IMGInfo.pxHeight;
      biPlanes        := 1;
      biBitCount      := 24;
      biCompression   := BI_RGB;
      biSizeImage     := IMGInfo.pxWidth * IMGInfo.pxHeight * 3;
    end;
 
    GetDIBits(BmpDC, Bmp, 0, BI^.bmiHeader.biHeight, NIL, TBitmapInfo(BI^), DIB_RGB_COLORS);
    Global := GlobalAlloc(GMEM_MOVEABLE, BI^.bmiHeader.biSizeImage);
    if Global <> 0 then
    begin
      // pImage - Pointer
      pImage := GlobalLock(Global);
      if pImage <> NIL then
      begin
        GetDIBits(BmpDC, Bmp, 0, BI^.bmiHeader.biHeight, pImage, TBitmapInfo(BI^), DIB_RGB_COLORS);
        GlobalUnlock(Global);
        // Данные в pImage загружаются нормально
      end;  
    end;
  finally
    FreeMem(BI, SizeOf(TBitmapInfo));
  end;
end;
 
...
// Запуск программы
...
 
if Global <> 0 then
  GlobalFree(Global);
0
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
18.09.2009, 02:25  [ТС] 6
Выяснилась одна вещь, если я вывожу изображение из Pointer`а, то вместо изображения каша, а если предварительно копирую из Pointer`а в массив такого вида:
Image : array[0..ImageHeight - 1, 0..ImageWidth - 1, 0..2] of GLUByte;
и затем уже произвожу вывод из него, то всё нормально. Объясните в чём может быть причина, ведь и там, и там информация одна и та же.
0
snake32
1660 / 1114 / 195
Регистрация: 26.02.2009
Сообщений: 4,122
Записей в блоге: 5
21.09.2009, 10:10 7
Может быть из-за какого-нибудь выравнивания

Каковы размеры Имиджа? Возможно это не профессионально, но я бы проверил бы последовательноть байт в памяти(pImage) при загрузке маленькой картинки, например, размером 5*5. или 3*3 (не краты 4). Причём состоящей из простых полосок, например чисто красной, синей, зелёной, и тп, короче где можно легко определить цвет пикселя по последовательности байт в памяти.
0
dsoft
12 / 12 / 0
Регистрация: 21.08.2009
Сообщений: 87
21.09.2009, 17:41  [ТС] 8
Похоже это глюк Delphi. Я сделал так:

Delphi
1
2
3
4
5
6
7
8
9
var
  pClockImage : array of PGLUByte;
  pSrc : Pointer;
  I : Integer;
 
  GetDIBits(BmpDC, Bmp, 0, BI^.bmiHeader.biHeight, pSrc, TBitmapInfo(BI^), DIB_RGB_COLORS);
  I := BI^.bmiHeader.biHeight * BI^.bmiHeader.biWidth * (BI^.bmiHeader.biBitCount div 8);
  SetLength(pClockImage, I);
  Move(pData^, pClockImage[0], I);
После чего изображение вывелось нормально из pClockImage (из pSrc - не выводится), для проверки я сохранил оба массива в файлы как RAW, просмоторщик показал идентичные изображения. Более того сравнение fc /b 1.raw 2.raw не показало разницы.

Вопрос теперь в другом, мне нужно вывести прозрачно, но маску делать не хочется. Подобный пример я нашёл у NeHe.
0
21.09.2009, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2009, 17:41

Рисовать поверх битмапа
Здравствуейте. Имеется картинка которая хранится в Битмапе, необходимо...

Получить размер битмапа в байтах
Привет, помогите разобраться со скоростью) У меня есть куча изображений,...

Добавление битмапа в неквадрат (полигон)
Допустим есть битмап. Есть полигон. Как залить битмап в полигон, чтобы полигон...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru