Конференция "Игры" » Изображения с прозрачным фоном в OpenGL [Delphi, Windows]
 
  • Veles-D (11.01.08 16:42) [0]
    Здравствуйте!
    Начинаю изучать OpenGL в Delphi - столкнулся с проблемой вывода изображений с прозрачным фоном. Использую DrawPixels - не получается. Может подскажете, как быть?
  • Dib@zol © (11.01.08 17:45) [1]
    Создавай текстуры не в GL_RGB, а в GL_RGBA формате. Для этого придётся переупаковывать байты при получении образа битмапа. То есть, в РГБ-виде цвет определяется только тремя составляющими: красным, синим и зелёным каналами. А в РГБА - красным, синим, зелёным, и ещё одним дополнительным каналом - каналом прозрачности. То есть на один пиксель рисунка приходится (по стандарту) аж целых 4 байта, вместо трёх у формата RGB. Вывод: при переупаковке анализируй цветовые составляющие и дописывай пикселю величину прозрачности на основании этих данных. Допустим, если красный канал преобладает, то прозрачность половинная (128), если преобладает синий - то минимальная (совсем непрозрачный пиксель - 255), если зелёный - пиксель полностью невидим (0).
  • Veles-D (11.01.08 19:23) [2]
    Что-то у меня совсем ничего не получается :(
    Какое-бы значение альфы я не задавал - всё без толку!

    Создание картинки:

    procedure tform1.MakeImage;
    var
    i, j : Integer;
    PixCol : TColor;
    Bitmap : TBitmap;
    begin
    Bitmap := TBitmap.Create;
    Bitmap.LoadFromFile ('image.bmp');
    For i := 0 to 99 do
    For j := 0 to 99 do begin
        PixCol := Bitmap.Canvas.Pixels [j, i];
        Image[100 - i - 1][j][0] := PixCol and $FF;
        Image[100 - i - 1][j][1] := (PixCol and $FF00) shr 8;
        Image[100 - i - 1][j][2] := (PixCol and $FF0000) shr 16;
        image[100 - i - 1][j][3] := 0 //(Может, здесь что не так?)
    end;
    Bitmap.Free;
    end;

    Вывод картинки:
     
    glDrawPixels(100, 100, GL_RGBa, GL_UNSIGNED_BYTE, @Image);

    Что же не так!?
    Картинка всё равно полностью видимая
  • Dib@zol © (11.01.08 19:45) [3]
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    Добавь это сразу после задания HGLRC (wglMakeCurrent). И произойдёт чЮдо! :)
    ЗЫ А собсна чего ты ожидал, если по умолчанию альфасмешение отключено? ;D
  • Elec3C © (11.01.08 19:56) [4]
    Н-да! Хранить текстуры в BMP - это круто!:\
  • Veles-D (11.01.08 19:56) [5]
    Примного благодарен. После стольких умственных напряжений!
  • Elec3C © (11.01.08 19:59) [6]
    Хотя бы проверял пиксели через сканлайн, что-ли.
  • Veles-D (11.01.08 20:09) [7]
    Да это так, для экспурименту...
  • rts111 © (11.01.08 20:42) [8]

    > Elec3C ©   (11.01.08 19:56) [4]
    > Н-да! Хранить текстуры в BMP - это круто!:\


    Bmp в некоторых случаях как раз самый то!
    Если например использывать 8 бит на пиксель, без RLE-сжатия,
    и не со стандартной палитрой Windows, а с своей оптимальной.

    Архиваторами сжимается как правило лучше чем jpg и png такого же размера(не размер файла, а размер изображения).

    И искажений нет как например в jpg.
  • Dib@zol © (11.01.08 21:01) [9]
    А можно и не через сканлайн, а даже быстрее. Вот вам мой модуль для "отекстуривания" картинок трёх наиболее распространённых форматов: BMP, JPG и GIF. Читайте аннотацию.

    http://webfile.ru/1678669
 
Конференция "Игры" » Изображения с прозрачным фоном в OpenGL [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0]