Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.033 c
14-1083224569
Kerk
2004-04-29 11:42
2004.05.23
Проездной


8-1079010705
_none_
2004-03-11 16:11
2004.05.23
как проиграть звук из AVI файла, имея AVIStream?


1-1084217733
killer
2004-05-10 23:35
2004.05.23
Вставка втроки в TStringList


8-1078388044
GH@ST
2004-03-04 11:14
2004.05.23
Как можно уменьшить JPG?


7-1082181103
dvl92
2004-04-17 09:51
2004.05.23
Как импортировать ссылки которые хранятся в "ИЗБРАННОМ" IE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский