Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

OpenGL или DirectX?   Найти похожие ветки 

 
alexey2004   (2004-01-21 17:16) [0]

Подскажите, пожалуйста, с помощью каких библиотек (OpenGL, DirectX,...) и КАК (алгоритм, хоть намеки) создать визуальные эффекты, похожие на те, которые реализованы в плагинах Winampa (AVS, Milk,...)
---
Alexey


 
Sapersky ©   (2004-01-22 10:00) [1]

OpenGL, DirectX - не обязательно. AVS, например, явно софтверный, судя по тому, как он тормозит :) (DX используется только для специфических режимов вывода - полноэкранного, оверлейного). Так что для начала можно посмотреть софтверные библиотеки обработки изображений - FastLib (на DelphiGFX есть - тут вверху ссылка), SpriteUtils (miek.narod.ru). Там довольно много всяких эффектов.


 
alexey2004   (2004-01-27 01:18) [2]

Спасибо за ответ, Sapersky!

Жаль только, что Fastlib лишен помощи...
Кроме того, обнаружил набор компонент G32 - тоже неплох.
В общем, работать есть над чем.
Еще раз спасибо, наилучшие пожелания


 
Opilki_Inside ©   (2004-03-02 14:21) [3]

2alexey2004:

Ну алгоритм элементарный...
сам когда-то писал, но исходников проводить не буду... просто я маленький был, очень криво в коде получалось...

Если програмка будет работать в 256 цветном режиме, будет проще работать с таблице палитры

Вобщем рисуешь яркую ломаную линию на черном фоне, потом делаешь увеличение картинки, делаешь сглаживание... берешь получившиюся картинку и повторяешь эту процедуру... и т.д...
потом вместо простого увеличения картинки попробуй сделать увеличение с учетом перспективы (это из 3х мерной графики, когда дальние объекты кажутся меньше размером), в 2х мерном случае, чем дальше точки от центра, тем быстрее они должны удаляться от него [центра]...
добавь потом элемент случайности в это увеличение, появятся всякие интересные образы и т.д...


 
Mihey ©   (2004-03-03 20:02) [4]

>Вобщем рисуешь яркую ломаную линию на черном фоне, потом делаешь увеличение картинки, делаешь сглаживание... берешь получившиюся картинку и повторяешь эту процедуру...

И тормозззаа!!!!!


 
Opilki_Inside ©   (2004-03-04 15:58) [5]

>И тормозззаа!!!!!

Никаких тормозов... Просто нужно писать правильно...
Смотри, у тебя есть 2 массива:
 1 - то что у тебя на экране
 2 - массив, имеющий размер экрана, в каждой ячейке которого описаны координаты пикселя из старой картинки

Т.о. никаких вычислений... всё просто летает

Или где тормоза-то возникнуть должны?


 
Petro   (2004-03-04 16:34) [6]

1 - Это Array of TPoint т.е. векторный массив полилинии?
2 - Array[1..800] of Array[1..600] of TPoint - двухмерный по размеру разрешения экрана?
Приведи схематично в виде кода.


 
Opilki_Inside ©   (2004-03-05 01:03) [7]

Вот... кривой до ужаса, просто давно писал...


unit uElectro;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;

type
 TElectro = class(TForm)
   Timer1: TTimer;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure Paint;
   procedure Blur;
   procedure BlurMap;
   procedure Timer1Timer(Sender: TObject);
   procedure GenerFuncMap;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Electro: TElectro;
 type
   TRGB=record
     b,g,r:byte;
   end;
   ARGB=array [0..1] of TRGB;
   PARGB=^ARGB;

var
   b,b1:tbitmap;
   map:array[0..640*480]of byte;
   bufmap:array[0..640*480]of byte;
   funcmap:array[0..640*480]of longint;
   resolution:tPoint;
   resolut:longint;
   iii:word;
   pal,gener:byte;
   gen:byte;

implementation

{$R *.DFM}

procedure TElectro.GenerFuncMap;
var i:longint;
   x,y,x1,y1:integer;
   xb,xb1:longint;
   n,n1,n2:integer;
   sn,cs:real;
begin
  n1:=resolution.x;n2:=resolution.y;
  i:=0;
  if gen=0 then
  begin
  for y:=0 to resolution.y-2 do
  begin
     xb1:=(((20+y)*22) div 24)*resolution.x;
     for x:=0 to resolution.x-1 do
     begin
        FuncMap[i]:=xb1+((20+x)*60) div 64;
        Inc(i);
     end;
  end;end;{}
  if gen=1 then begin
   for i:=0 to resolut do funcmap[i]:=0;
   n:=(resolution.y-5)div 2;
   sn:=sin(0.01);cs:=cos(0.05);
   for y:=12 to n2 -12do
     for x:=12 to n1 -12 do
    begin
      x1:=round((x-n1 div 2)*cs-(y-n2 div 2)*sn)+n1 div 2;
      y1:=round((x-n1 div 2)*sn+(y-n2 div 2)*cs)+n2 div 2;
      if sqr(x-n1 div 2)+sqr(y-n2 div 2)<sqr(n1-2)+sqr(n2-2) then
      funcmap[abs(x)+(abs(y))*resolution.x]:=x1+y1*n1 else
      funcmap[abs(x)+(abs(y))*resolution.x]:=0;
    end;end;{}
   if gen=2 then begin
   for i:=0 to resolut do funcmap[i]:=0;
   n:=(resolution.y-5)div 2;
   sn:=sin(0.04);cs:=cos(0.1);
   for y:=12 to n2 -12do
   begin
      for x:=12 to n1 -12 do
      begin
         x1:=round((x-n1 div 2)*cs-(y-n2 div 2)*sn)+n1 div 2;
         y1:=round((x-n1 div 2)*sn+(y-n2 div 2)*cs)+n2 div 2;
         xb1:=(((20+y1)*22) div 24)*n1;
         if sqr(x-n1 div 2)+sqr(y-n2 div 2)<sqr(n1-2)+sqr(n2-2) then
         funcmap[abs(x)+(abs(y))*resolution.x]:=xb1+((20+x1)*60) div 64 else//x1+y1*n1 else
         funcmap[abs(x)+(abs(y))*resolution.x]:=0;
      end;{}
   end;end;
end;

procedure TElectro.BlurMap;
var i:longint;
   x,y,x1,y1:integer;
   xb,xb1:longint;
   p:pargb;
   sn,cs:double;

begin
  map[0]:=0;
  for i:=resolution.x to 640*480-641 do
     map[i]:=(map[i-1]+map[i+1]+map[i-resolution.x]+map[i+resolution.x]-3)div 4;
  for i:=0 to resolut do bufmap[i]:=map[i];
  for i:=0 to resolut do map[i]:=bufmap[funcmap[i]];
  i:=0;
  if pal=0 then
  for y:=1 to b.height-1 do
  begin
      p:=b.scanline[y];
      for x:=0 to b.width-1 do
      begin
         p[x].g:=0;
         p[x].b:=map[i];
         p[x].r:=map[i];
         inc(i);
      end;
  end;
  if pal=1 then
  for y:=1 to b.height-1 do
  begin
      p:=b.scanline[y];
      for x:=0 to b.width-1 do
      begin
          p[x].r:=map[i];p[x].b:=0;
          if map[i]>127 then
          p[x].g:=map[i]shl 1-255 else p[x].g:=0;{}
         inc(i);
      end;
  end;
  b.canvas.TextOut(0,b.height-20,"Author: Pavel Maltsev ");
  canvas.draw(0,0,b);
end;

procedure TElectro.Blur;
var p,p1:pargb;
   x,y:integer;
begin

  for y:=10 to b.height-11 do
  begin
    p:=b.scanline[y];
    p1:=b1.scanline[y-10];
    for x:=10 to b.width-11 do
    begin
       p1[x-10].b:=p[x].b;
    end;
  end;
  for y:=1 to b.height-1 do
  begin
    p:=b.scanline[y];
    p1:=b1.scanline[(y*46)div 48 ];
    for x:=1 to b.width-1 do
    begin
       p[x].b:=p1[(x*62)div 64].b
    end;
  end;
  for y:=2 to b.height-2 do
  begin
     p:=b.scanline[y];
     for x:=2 to b.width-2 do
     begin
         p[x].b:=(p[x+1].b+p[x-1].b+p[x+b.width].b+p[x-b.width].b)shr 2;{}
     end;
  end;
end;

procedure TElectro.FormCreate(Sender: TObject);
var i:longint;
begin
  pal:=0;
  Resolution.x:=640;Resolution.y:=480;
  resolut:=resolution.x*resolution.y;
  Randomize;
  b:=tBitmap.Create;
  b.width:=resolution.x;b.height:=resolution.y;
  b1:=tBitmap.create;
  b1.width:=b.width-20;b1.height:=b.height-20;
  b.pixelformat:=pf24bit;b1.pixelformat:=pf24bit;
  b.canvas.brush.style:=bsSolid;
  b.canvas.brush.color:=0;
  b.canvas.pen.color:=0;
  b.canvas.rectangle(0,0,b.width,b.height);
  b.canvas.pen.color:=rgb(0,0,255);
  b.canvas.Font.color:=rgb(0,0,255);
  b.canvas.Pen.Width:=1;
  for i:=0 to resolut do
    map[i]:=0;
  gen:=random(3);
  GenerFuncMap;
end;

procedure TElectro.FormDestroy(Sender: TObject);
begin
  b.free;
  b1.free;
end;

procedure TElectro.Paint;
var p:pargb;
   x,y,xs,ys,xe,ye,i,j:integer;
   x1,y1:integer;
   xx,yy:array[0..100] of integer;
   colraz:byte;
   k:word;
   gr,pr:byte;
procedure pix(x,y:integer);
begin
 if (y>0) and (x>0) and (x<b.width) and (y<b.height-10) then
 begin
   p:=b.scanline[y];
   p[x].b:=255;
   p[x].r:=0;
   p[x].g:=0;
  end;
end;
procedure mappix(x,y:integer);
begin
  if (x>1) and (y>1) and (x<resolution.x-1) and (y<resolution.y-1) then
  begin
     map[x+y*resolution.x]:=255;
     map[x+y*resolution.x+1]:=127;
     map[x+(y+1)*resolution.x+1]:=127;
     map[x+(y+1)*resolution.x]:=127;{}
  end;
end;
begin
if random(5)=3 then
begin
   pr:=random(2);
   if pal<>pr then pal:=pr;
   gr:=random(3);
   if gen<>gr then
   begin
      gen:=gr;
      GenerFuncMap;
   end;
end;
for iii:=0 to 10 do
begin
  ye:=b.height;
  ys:=(b.height-50) div 2-40;
  xs:=0;xe:=b.width;
  y:=ys;x:=xs;colraz:=0;
  y1:=resolution.y-y;x1:=x;
  repeat
       if odd(k) then x:=x+random(4)-1 else inc(x);
       if odd(k div 2) then y:=y+random(5)-2;
       mappix(x,y);
       if odd(k) then x1:=x1+random(4)-1 else inc(x1);
       if odd(k div 2) then y1:=y1+random(5)-2;
       mappix(x1,y1);
       inc(k);
  until (x>xe)or(k>64000);
 blurmap;
 end;
end;

procedure TElectro.Timer1Timer(Sender: TObject);
begin
  Paint;
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
7-1080128126
Александр1
2004-03-24 14:35
2004.05.23
Процессы!


14-1083436789
RealRascal
2004-05-01 22:39
2004.05.23
Ярлыком выключить монитор


3-1083141787
Frozzen
2004-04-28 12:43
2004.05.23
Раскраска строк в Гриде


8-1078282572
ИМХО
2004-03-03 05:56
2004.05.23
Монохромность


14-1083772753
Thor
2004-05-05 19:59
2004.05.23
Посещаете ли вы фитнес-клубы, качалки, спортзалы, etc.?