Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > примитивный рендер графики


Автор: СЭНСЭЙ 15.5.2016, 18:48
Привет всем.

Использую в своих проектах такой метод наложения спрайта на канву с возможностью
затенять кустомный цвет, создавая эффект теней.
В данной теме момент с тенями не важен.
Код

procedure copybmpwithshadows(clshad1,clshad2,trans:Tcolor;dx,dy:integer; var dest,src:tbitmap);
var
tdest,otemp:tbitmap;
p:PByteArray;
pcs,pct:PRGBArray;
tc:tcolor;
i,j,x,y,r,g,b,f:integer;
itc1,itc2,itct:longint;
r81,g81,b81,r82,g82,b82,r8t,g8t,b8t:byte;
begin
//создаются два временных мепа размером с источник
tdest:=tbitmap.Create;
tdest.Width:=src.width;
tdest.Height:=src.height;
otemp:=tbitmap.Create;
otemp.Width:=tdest.Width;
otemp.Height:=tdest.height;
bitblt(tdest.Canvas.Handle,0,0,tdest.Width,tdest.Height,dest.Canvas.Handle,0,0,srccopy);
bitblt(otemp.Canvas.Handle,0,0,otemp.Width,otemp.Height,src.Canvas.Handle,0,0,srccopy);
otemp.PixelFormat:=pf24bit;
tdest.PixelFormat:=pf24bit;

//            R   G   B
//clAqua:     0   255 255
//clFuchsia:  255 0   255
//$00FF96FF:  255 150 255
  if clshad1<>0 then
  begin
  itc1 := ColorToRGB(clshad1);
  r81     := itc1;
  g81     := itc1 shr 8;
  b81     := itc1 shr 16;
  end;

  if clshad2<>0 then
  begin
  itc2 := ColorToRGB(clshad2);
  r82     := itc2;
  g82     := itc2 shr 8;
  b82     := itc2 shr 16;
  end;

  itct := ColorToRGB(trans);
  r8t     := itct;
  g8t     := itct shr 8;
  b8t     := itct shr 16;


for y:=0 to otemp.Height-1 do
begin
pcs:=otemp.ScanLine[y];
pct:=tdest.ScanLine[y];

for x:=0 to otemp.Width-1 do
begin
if clshad1<> 0 then if ((pcs[x].rgbtRed=r81) and (pcs[x].rgbtGreen=g81) and (pcs[x].rgbtBlue=b81)) then
begin
r:=pct[x].rgbtRed-20;if r<0 then r:=0;pcs[x].rgbtRed:=r;
g:=pct[x].rgbtGreen-20;if g<0 then g:=0;pcs[x].rgbtGreen:=g;
b:=pct[x].rgbtBlue-20;if b<0 then b:=0;pcs[x].rgbtBlue:=b;
end;
if clshad2<> 0 then if ((pcs[x].rgbtRed=r82) and (pcs[x].rgbtGreen=g82) and (pcs[x].rgbtBlue=b82)) then
begin
r:=pct[x].rgbtRed-40;if r<0 then r:=0;pcs[x].rgbtRed:=r;
g:=pct[x].rgbtGreen-40;if g<0 then g:=0;pcs[x].rgbtGreen:=g;
b:=pct[x].rgbtBlue-40;if b<0 then b:=0;pcs[x].rgbtBlue:=b;
end;
if ((pcs[x].rgbtRed=r8t) and (pcs[x].rgbtGreen=g8t) and (pcs[x].rgbtBlue=b8t)) then
begin
pcs[x].rgbtRed:=pct[x].rgbtRed;
pcs[x].rgbtGreen:=pct[x].rgbtGreen;
pcs[x].rgbtBlue:=pct[x].rgbtBlue;
end;
end;

end;

//otemp.Transparent:=true;
//otemp.TransparentColor:=clAqua;
//dest.Canvas.Draw(dx,dy,otemp);
bitblt(dest.Canvas.Handle,dx,dy,otemp.Width,otemp.Height,otemp.Canvas.Handle,0,0,srccopy);

otemp.Free;
tdest.Free;

end;


Для не быстрого вывода графики 3-4 гц более чем подходит.
Плюс в том, что не требует ни софта стороннего, ни железа.
Работает с любой версией виндовс.
Но для анимации 60 гц кажется не очень подходит.
Я не проверял сильно. Но есть подозрения что не выдержит частоту если будет много спрайтов.

Подскажите как можно оптимизировать эту функцию, или подскажите альтернативу.
Но для меня важно что бы остался тот же принцип - не использовать никакие библиотеки типа директ икса  или опенжл. И наибольшая совместимость с ОСями и железом.
Возможно ли это?

Автор: fr0und 17.5.2016, 20:09
http://www.polyotnn.ru/
ООО "Концерн "Объединенные Заводы Полет"
Предлагаем услуги по выполнению заказов:
- Точная металлообработка (обработка металлов резанием, листовая штамповка); 
- Литье пластмасс; 
- Литье алюминиевых сплавов; 
- Окраска порошковой краской в электростатическом поле; 
- Проектирование и изготовление штампов, прессформ и другой технологической оснастки; 
- Изготовление нестандартного оборудования; 
- Гальванопокрытия;
- Сборочное производство.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/primitivny-render-grafiki-id57389ae6ae201586118b4567#findElement_E7045_573b5030ae201574020d6b16_0

Автор: frostliner 18.5.2016, 21:09

http://pxyz.ru/
ПРОКОМ                                        
Армейские кровати соответствуют ГОСТ 2056-77.
Комплектация армейских кроватей позволяет устанавливать их как одну двухъярусную или две одноярусных кровати.
ПРОДАЕМ РАСКЛАДУШКИ, СТУЛЬЯ И ТУМБОЧКИ
ПРОДАЕМ ПОСТЕЛЬНЫЕ КОМПЛЕКТЫ ДЛЯ РАБОЧИХ СТРОИТЕЛЕЙ
ПРОДАЕМ ВАТНЫЕ МАТРАЦЫ
СНАБЖАЕМ МЕТАЛЛИЧЕСКИМИ КРОВАТЯМИ И ПОСТЕЛЬНЫМИ ПРИНАДЛЕЖНОСТЯМИ РАБОЧИХ СТРОИТЕЛЬНЫХ, ОХРАННЫХ И ДРУГИХ ПРЕДПРИЯТИЙ, РАБОТАЮЩИХ ВАХТОВЫМ МЕТОДОМ.
Работаем с юридическими  лицами с учетом НДС.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/primitivny-render-grafiki-id57389ae6ae201586118b4567#findElement_E7045_573cafe8ae201574210d7363_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)