Форум: "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