{{notification.text}}

MirGames

son
11.02.10 20:33
0
Для вывода на поверхность использую GDI. Как мне преобразовать рисунок, чтобы вывести его функцией AlphaBlend. Имеется ввиду, когда каждому пикселю задан свое значение прозрачности. Рисунки сделанные фотошопом не подходят. И если не трудно укажите ссылки на альтернативные варианты решения проблемы.
#1
Программир Всия Руси!
11.02.10 20:35
0
son
В чем пишешь? Просто GDI+ умеет вроде PNG выводить и в C++Builder и Delphi в последних версиях есть поддержка PNG тоже.
#2
son
11.02.10 20:37
0
Цитата(DRON @ 11.02.2010 - 13:35) [snapback]101659[/snapback]

son
В чем пишешь? Просто GDI+ умеет вроде PNG выводить и в C++Builder и Delphi в последних версиях есть поддержка PNG тоже.

Пишу на Delphi 7. Если можно поподробнее о работе с PNG :blush:
#3
Программир Всия Руси!
11.02.10 20:56
0
son
В Delphi7 такого нет, можно поискать компанент для работы с PNG в 2009-м RadStudio точно есть сразу.
#4
son
12.02.10 11:47
0
И все же. Как быть с AlphaBlend? Я в данный момент пытаюсь постичь основы DirectX. С помощью функций GDI рисую на поверхности. Столкнулся с этой проблемой. Как использовать всетаки альфа канал?
#5
Программир Всия Руси!
12.02.10 12:26
0
son
DirectDraw что ли используешь? Скажи вообще как глобально то задача стоит :)
#6
son
12.02.10 12:32
0
Цитата(DRON @ 12.02.2010 - 05:26) [snapback]101676[/snapback]

son
DirectDraw что ли используешь? Скажи вообще как глобально то задача стоит :)

Да. Подключаю модуль DirectDraw. Создаю 2 поверхности: основную и буфер. Рисую с помощью функций GDI (BitBlt, TransparentBlt, AlphaBlend - пытаюсь) на буферной поверхности и меняю их. Все как говорится по учебнику. Столкнулся с проблемой, что рисунки подготовленные с помощью фотошоп, содержащие альфа канал, не воспринимаются функцией AlphaBlend. Сделать весь рисунок полупрозрачным удается, а вот реализовать Прозрачность отдельных пикселей нет.
Цитата

procedure DrawAlpha(Bmp:HBitmap;Left,Top,Width,Height:integer;Alpha:Byte);
var DC:HDC;
srcDC:HDC;
blnd:BLENDFUNCTION;
begin
//
if (HERENG.snLoad.GetDC(DC) = DD_OK) then//создаю контекст устройства
//совмесщенный с поверхностью
begin
srcDC := CreateCompatibleDC( 0 );
SelectObject(srcDC,Bmp);
blnd.BlendOp:=AC_SRC_OVER;//заполняю структуру BLENDFUNCTION
blnd.BlendFlags:=0;
blnd.SourceConstantAlpha:=Alpha;//степень прозрачночти. если указать 255 должен использоваться альфа канал
blnd.AlphaFormat:=AC_SRC_ALPHA;//опять таки что бы использовался альфаканал
AlphaBlend(dc,Left,Top,Width,Height,srcDC,0,0,Width,Height,blnd);
DeleteDC(srcDC);
HERENG.snLoad.ReleaseDC(DC);//на выходе получаем просто рисунок на поверхности без намека на прозрачность
end;
end;
Отредактировано: 12.02.10 12:39
#7
Программир Всия Руси!
12.02.10 13:14
0
son
Потому что формат TBItmap вообще то не содержит альфаканала. Альфаканал есть только в GIF, PNG, TGA и еще ряде менее популярных форматах.
Кроме RGB данных должна еще присутствовать маска в TBitmap ее нет. Если работать с Bitmap'ами, то единственный выход сделать 2 картинки одну RGB а другую - черно-белую маску.

P.S. Не хочешь просто использовать готовый движок и не изобретать велосипеда?
Отредактировано: 12.02.10 13:15
#8
son
12.02.10 13:31
0
Цитата(DRON @ 12.02.2010 - 06:14) [snapback]101678[/snapback]

son
Потому что формат TBItmap вообще то не содержит альфаканала. Альфаканал есть только в GIF, PNG, TGA и еще ряде менее популярных форматах.
Кроме RGB данных должна еще присутствовать маска в TBitmap ее нет. Если работать с Bitmap'ами, то единственный выход сделать 2 картинки одну RGB а другую - черно-белую маску.

P.S. Не хочешь просто использовать готовый движок и не изобретать велосипеда?

Я использую HBITMAP. насколько я понимаю это не тот TBitmap, который используется VCD. Не могли бы вы указать пример использования альфа канала с одним из приведенных форматов.
По поводу велосипеда хочется понять все самому. Видимо такая у меня форма извращения :blush:
#9
Программир Всия Руси!
12.02.10 14:16
0
son
HBITMAP то же что и TBitmap, только первое WinAPI, а второй обертка VCL над ним.
Дальше я тебе помочь не смогу т.к. DirectDraw не использовал оно вообще уже давно не поддерживается и считается анахронизмом. Равно как не изгалялся с BMP, пользовал TGA или PNG всегда.
Можешь посмотреть DelphiX он использует DirectDraw и в нем все есть.
Больше увы ничем помочь не могу.
#10
son
12.02.10 14:20
0
Цитата(DRON @ 12.02.2010 - 07:16) [snapback]101680[/snapback]

son
HBITMAP то же что и TBitmap, только первое WinAPI, а второй обертка VCL над ним.
Дальше я тебе помочь не смогу т.к. DirectDraw не использовал оно вообще уже давно не поддерживается и считается анахронизмом. Равно как не изгалялся с BMP, пользовал TGA или PNG всегда.
Можешь посмотреть DelphiX он использует DirectDraw и в нем все есть.
Больше увы ничем помочь не могу.

:( Мда. Облом. Тогда дайте пинка в нужном направлении. Хочу изучить DirectX, создав движок для 2д(в идеале 3д) графики. Что мне использовать и укажите ссылку для начинающих.
#11
Программир Всия Руси!
12.02.10 15:16
0
son
Использовать только Direct3D. Можно посмотреть как работают такие движки как например Asphyre.
#12
son
12.02.10 15:28
0
Цитата(DRON @ 12.02.2010 - 08:16) [snapback]101683[/snapback]

son
Использовать только Direct3D. Можно посмотреть как работают такие движки как например Asphyre.

Большое спасибо! Пример нашел на Gamedev. Буду разбираться. С AlphaBlend я всетаки разберусь - дело принципа. Пойду переписывать)
#13
12.02.10 16:50
0
Цитата
Потому что формат TBItmap вообще то не содержит альфаканала. Альфаканал есть только в GIF, PNG, TGA и еще ряде менее популярных форматах.
Кроме RGB данных должна еще присутствовать маска в TBitmap ее нет. Если работать с Bitmap'ами, то единственный выход сделать 2 картинки одну RGB а другую - черно-белую маску.

TBtimap поддерживает альфаканал, для этого его формат ставится в pf32bit, пиксель становится ARGB. Именно такой tbitmap кушает UpdateLayeredWindow и Alphablend.

Автор, глянь тут: http://desksoft.ru/index.php?forum=13&th=187
http://desksoft.ru/index.php?forum=13&th=192
http://desksoft.ru/index.php?forum=13&th=47
#14
12.02.10 16:54
0
Возможно езе пригодится пример конвертирования PNG->BMP:
http://desksoft.ru/index.php?downloads=att...ents&id=254

Там же вывод на канву средствами GDI, создание буферного битмапа лучше вынести и не создавать его каждый раз. Альфабленд у меня бывало глючила, не люблю ее :)
#15
Программир Всия Руси!
12.02.10 17:27
0
Цитата(antonn @ Сегодня, 14:50)
[snapback]101688[/snapback]
TBtimap поддерживает альфаканал, для этого его формат ставится в pf32bit

Ну там однобитовый альфаканал т.е. никакой полупрозрачности быть не может.
#16
Швец, жнец, на дуде игрец
12.02.10 19:50
0
Цитата(DRON @ 12.02.2010 - 15:27) [snapback]101690[/snapback]

Ну там однобитовый альфаканал т.е. никакой полупрозрачности быть не может.

Не совсем.
24 бита = по восемь бит на R, G, и B
32 бита = по восемь бит на R, G, B и + 8 бит на альфа-канал

son, я тоже ужасно намучался с альфа-каналом в DirectDraw.
Легче всего написать свою функцию альфа-блиттинга, а не использовать кривую и недокументированную AlphaBlt. Тем более это совсем просто.
В самом простом варианте для 32-битных поверхностей формула альфа-блендинга такая:
Код

var
type
  TRGBA = record
      R, G, B, A: Byte;
  end;
...
DestColor, SourceColor: TRGBA;
...
DestColor.R := round ((SourceColor.A * (SourceColor.R - DestColor.R)) + DestColor.R);
DestColor.G := round ((SourceColor.A * (SourceColor.G - DestColor.G)) + DestColor.G);
DestColor.B := round ((SourceColor.A * (SourceColor.B - DestColor.B)) + DestColor.B);


Где SourceColor - цвет исходного пикселя, где DestColor - цвет пикселя на той поверхности, куда происходит блиттинг.

В общем, это легче показать на примере :)
Скоро дам рабочую функцию для DirectDraw.
Отредактировано: 12.02.10 20:20
#17
12.02.10 20:08
0
Цитата
Ну там однобитовый альфаканал т.е. никакой полупрозрачности быть не может.

все там есть, как в лучших домах ЛандОна и Парижа :)

PS "Мое кунфу" =)
#18
Программир Всия Руси!
13.02.10 01:52
0
antonn
Прямо открытие для меня :))) Ну ты то знатный GDIшник :))) а я все OpenGL да OpenGL :)
Отредактировано: 13.02.10 01:52
#19
03.04.10 07:45
0
Почитай тогда для начала Андрэ Ламота

"Программирование трехмерных игр для Windows .Советы профессионала по трехмерной графике и растеризации"

Там тебе и альфасмешивание и куча других плюшек.
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}