-
Здравствуйте! Начинаю изучать OpenGL в Delphi - столкнулся с проблемой вывода изображений с прозрачным фоном. Использую DrawPixels - не получается. Может подскажете, как быть?
-
Создавай текстуры не в GL_RGB, а в GL_RGBA формате. Для этого придётся переупаковывать байты при получении образа битмапа. То есть, в РГБ-виде цвет определяется только тремя составляющими: красным, синим и зелёным каналами. А в РГБА - красным, синим, зелёным, и ещё одним дополнительным каналом - каналом прозрачности. То есть на один пиксель рисунка приходится (по стандарту) аж целых 4 байта, вместо трёх у формата RGB. Вывод: при переупаковке анализируй цветовые составляющие и дописывай пикселю величину прозрачности на основании этих данных. Допустим, если красный канал преобладает, то прозрачность половинная (128), если преобладает синий - то минимальная (совсем непрозрачный пиксель - 255), если зелёный - пиксель полностью невидим (0).
-
Что-то у меня совсем ничего не получается :( Какое-бы значение альфы я не задавал - всё без толку!
Создание картинки:
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);
Что же не так!? Картинка всё равно полностью видимая
-
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Добавь это сразу после задания HGLRC (wglMakeCurrent). И произойдёт чЮдо! :) ЗЫ А собсна чего ты ожидал, если по умолчанию альфасмешение отключено? ;D
-
Н-да! Хранить текстуры в BMP - это круто!:\
-
Примного благодарен. После стольких умственных напряжений!
-
Хотя бы проверял пиксели через сканлайн, что-ли.
-
Да это так, для экспурименту...
-
> Elec3C © (11.01.08 19:56) [4] > Н-да! Хранить текстуры в BMP - это круто!:\
Bmp в некоторых случаях как раз самый то! Если например использывать 8 бит на пиксель, без RLE-сжатия, и не со стандартной палитрой Windows, а с своей оптимальной.
Архиваторами сжимается как правило лучше чем jpg и png такого же размера(не размер файла, а размер изображения).
И искажений нет как например в jpg.
-
А можно и не через сканлайн, а даже быстрее. Вот вам мой модуль для "отекстуривания" картинок трёх наиболее распространённых форматов: BMP, JPG и GIF. Читайте аннотацию. http://webfile.ru/1678669
|