Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
ВнизВывода битмапа по маске и под углом Найти похожие ветки
← →
Evgnevius © (2009-12-09 14:31) [40]а что такое xForm?
← →
Рамиль © (2009-12-09 15:28) [41]
> а что такое xForm?
Матрица аффинного преобразования (в виде рекорда).XFORM = record
eM11 : Single;
eM12 : Single;
eM21 : Single;
eM22 : Single;
eDx : Single;
eDy : Single;
end;
LPXFORM = ^XFORM;
_XFORM = XFORM;
TXFORM = XFORM;
PXFORM = ^XFORM;
Трудно нажать Ctrl и щелкнуть?
← →
antonn © (2009-12-09 15:48) [42]
> Этот перебор и есть главный тормоз не смотря на то, что
> используется ScanLine.
попробуй фастлиб
← →
Evgnevius © (2009-12-09 15:59) [43]Рамиль, спасибо за ваше терпение. Я нажимал Ctrl и щёлкал. Кроме того, нажимал ещё и F1.
antonn, Если фастлиб не использует видеокарту, то спасибо. Процессор не хочу напрягать, так как пишу плагин, в котором на одном битмапе другой должен выводиться в разных пропорциях и с разными углами поворотов от нескольких сотен до нескольких тысяч раз. Координаты вывода для каждого битмапа должны пересчитываться динамически. Спасибо за предложенную помощь.
← →
antonn © (2009-12-09 16:05) [44]не стоит выкидывать процессор, он не так уж плох :)
если нужно выводить с последующим отображением на экране, то зачем делать это несколько тысяч раз?
← →
Evgnevius © (2009-12-11 23:10) [45]Несколько тысяч - это конечно многовато. Скорее - несколько сотен раз. А зачем - это уже зависит от поставленной задачи. Если хотите, можете поглядеть, на наше творчество 2-х летней давности, то, что мы сделали без использования OpenGL, чисто на ресурсах процессора.
www.ntlab.su
← →
Evgnevius © (2009-12-12 00:10) [46]Ладно, ребят. Вижу, что все вы хотите мне помочь, однако, как я понял, специалисты по OpenGL на этот топик не заходили. Придётся исхитряться
← →
Рамиль_ (2009-12-12 16:28) [47]GDI+ за глаза.
Почитайте книжку про компьютерную графику, будет намного легче.
← →
Sapersky (2009-12-12 19:24) [48]Evgnevius © (09.12.09 01:22) [37]
М-да, похоже, чукча катастрофически не читатель.
Ткну носом в фастлибовский код (вариант без сглаживания). Разницу с твоим в кол-ве операций замечаешь?
for y:=0 to Dst.Height-1 do begin
dy:=cy-y;
sdx:=(ax+(isin*dy))+xd;
sdy:=(ay-(icos*dy))+yd;
for x:=0 to Dst.Width-1 do begin
dx:=sdx shr 16;
dy:=sdy shr 16;
if(dx<Src.Width)and(dy<Src.Height)then pc^:=Src.Pixels24[dy,dx];
Inc(sdx,icos);
Inc(sdy,isin);
Inc(pc);
end;
pc:=Ptr(Integer(pc)+Dst.Gap);
end;
Теория, если коротко, такова:
1) Вращение - это аффинное преобразование, и сводится к операции умножения на матрицу (уже писали). Точнее, конкретно для вращения (+ пропорционального масштабирования) достаточно иметь два коэфф-та, синус-косинус, ну и смещение (ещё два числа).
2) Для поддержки масштабирования/сглаживания удобнее считать обратное преобразование, т.е. результирующая картинка считается неповёрнутой, а из исходной пиксели выбираются с поворотом.
3) Можно упростить формулу преобразования за счёт того, что последовательно считаются соседние по горизонтали пиксели, и в результате свести всё к двум сложениям на пиксель.
4) Желательно использовать fixed point (эмуляцию дробных чисел целыми), т.к. с плавающей точкой Round тормозит.
Хотя сотни FPS на высоких разрешениях результирующей картинки этот код может не потянуть (старичок P3-1200, 800*600, 8 бит: без сглаживания - 70 FPS, со сглаживанием - 40), но по сравнению с твоим - в десятки-сотни раз быстрее.
Видеокарта, конечно, повернёт быстрее, но там свои проблемы. Передача данных в видеопамять не мгновенна, а если понадобится в обратном направлении (для доп. обработки на CPU) - наверняка растеряешь на этом всё ускорение, разве что на самых последних картах оно не очень тормозит (GF GTS, возможно GF 8000-9000 серий). Как вариант - перенести вообще всю обработку картинок на видеокарту (шейдеры, GPGPU...). Но это, прямо скажем, непросто, а для каких-то специфических алгоритмов может быть вообще невозможно.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.006 c