![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывода битмапа по маске и под углом [D7, XP]
Evgnevius © (2009-12-01 18:56:00)Подскажите, пожалуйста, как это делать, а то OpenGL для меня - тёмный лес, однако нужно именно с её помощью, так как очень важна скорость. С помощью средств GDI всё у меня получается прекрасно, однако тормозит. Помогите, кто знает как.
Sapersky (2009-12-02 17:29:00) [21]Можно без увеличения/уменьшения. Я уже объяснял здесь:
http://www.delphimaster.net/view.php?folder=60&file=18-1231614795
antonn (2009-12-02 17:24:00) [22]
> Попробую поянить подробнее. В общем, мне нужно создать битмап
> и вывести его так, чтобы его края не были в виде лесенки
> при поворотах. Поэтому нужно просто сглаживать края, а это
> можно сделать, если использовать маску вывода (хоть альфа-
> канал, хоть как его назови). Картинка должна меняться в
> реальном времени, поэтому важна скорость.
Маска тут не совсем нужна. Я увеличиваю изображение в 2/3/4 раза, поворачиваю его, а потом уменьшаю в 2/3/4 раза (выбирая средний цвет из "кубиков" 2*2 пикселей (3*3/4*4)), получается с антиалиасингом (суперсемплинг типа :)), в том числе и альфаканал "плавно" уменьшается, и по нему уже рисую.
в ОГЛ ведь есть свои инструменты для поворотов.
Sapersky (2009-12-02 17:23:00) [23]А то, что я тут выложил - это просто жёсткий напряг для центрального процессора.
Это крайне нерациональное использование мощностей ЦП.
Я [14] для кого писал?
У меня есть эта книга... Но толку от этого мало.
То, что тебе нужно, называется "наложение текстуры". В разделе "спецэффекты", вроде.
Рамиль (2009-12-02 16:33:00) [24]Если уж на то пошло, угол можно выставить API SetWorldTransform, зачем изобретать велосипед?
> Углы одинаковые, а координаты разные, поэтому, изходя из
> заданного угла разсчитываются координаты для каждой точки
> выводимого изображения
Поворот выполняется умножением вектора на заранее просчитанную матрицу.
http://www.compgraphics.info/2D/affine_transform.php
P. S. Непоколебима тяга людей к изобретению велосипедов :)
RWolf (2009-12-02 16:21:00) [25]но синусы-то зачем при этом пересчитывать?
угол поворота изображения — константа.
Evgnevius (2009-12-02 15:43:00) [26]Углы одинаковые, а координаты разные, поэтому, изходя из заданного угла разсчитываются координаты для каждой точки выводимого изображения
RWolf (2009-12-02 15:12:00) [27]
> Синусы и арксинусы нужны для поворота каждой точки.
если речь о повороте изображения на заданный угол, то они одинаковые для всех точек.
Evgnevius (2009-12-02 15:07:00) [28]RWolf, Синусы и арксинусы нужны для поворота каждой точки. Так что, изходя из написанного мной и, вообще, поставленной задачей, выход один - это увеличение скорости построения изображения, а для этого есть только один способ: использовать возможности видеокарты. А то, что я тут выложил - это просто жёсткий напряг для центрального процессора.
Evgnevius (2009-12-02 15:02:00) [29]Попробую поянить подробнее. В общем, мне нужно создать битмап и вывести его так, чтобы его края не были в виде лесенки при поворотах. Поэтому нужно просто сглаживать края, а это можно сделать, если использовать маску вывода (хоть альфа-канал, хоть как его назови). Картинка должна меняться в реальном времени, поэтому важна скорость.
RWolf (2009-12-02 14:25:00) [30]Приемлемый FPS для случая вращения картинки умеренного размера можно получить и без применения OpenGL.
Если, конечно, не считать синусы с косинусами для каждой точки, как в приведённом коде.
Evgnevius (2009-12-02 13:26:00) [31]Sapersky, спасибо. У меня есть эта книга... Но толку от этого мало.
Sapersky (2009-12-02 00:36:00) [32]Книга Краснова по OGL:
http://d3dengine.narod.ru/books.html
Evgnevius (2009-12-02 00:02:00) [33]Я мне нужно на контекст OpenGL выводить битмап с использованиаем маски прозрачности и под углом
antonn (2009-12-01 23:40:00) [34]Ниче не покажу, если надо на ОГЛ :) сбило с толку "битмап". ОГЛ ведь в окно рендерит (хоть и можно снять с dc скриншот).
можно попробывать софтваре сообразить, но было бы лучше скинуть тестовый проект с уже наработанным, дабы посравнивать - а есть ли смысл.
Sapersky (2009-12-01 23:04:00) [35]Потенциально на софтвере можно получить такую скорость:
http://sapersky.narod.ru/files/FastLIBv389i.rar(пример Rotozoom)
Там, правда, 8 бит, 24 (есть в FastFX.Rotate) будет раза в 2-3 медленнее. Ещё на скорость влияет использование сглаживания и размер результирующей (исходной в меньшей степени) картинки.
Насчёт "маски" не вполне понял, то ли фиксированная альфа нужна, то ли альфа-канал. Ну это тоже можно прикрутить.
Evgnevius (2009-12-01 22:51:00) [36]Скорость очень важна - доли секунды - это много
Прорисовка вообще не имеет значения, самое медленное здесь - это математические операции, выполняемые с помощью ЦП, а не ГП
Evgnevius (2009-12-01 22:45:00) [37]не спасибо, с пикселями у нас всё впорядке -
PComp_GetPixelиPComp_PutPixelнаписаны на основеScanLine
А мне нужно именно на OpenGL
Andy BitOff (2009-12-01 22:44:00) [38]А в целом для задачи я бы взял GDI+
Andy BitOff (2009-12-01 22:43:00) [39]> Evgnevius © (01.12.09 22:39) [8]
Вот в этом и проблема. Сейчас тебе antonn © расскажет как надо работать с пикселями. От себя могу посоветовать http://www.delphimaster.ru/articles/pixels/
Evgnevius (2009-12-01 22:40:00) [40]procedure CL_GetRGB(C: TColor; var R, G, B: Integer); stdcall;
begin
if C > $FFFFFF then C := $FFFFFF;
if C < 0 then C := 0;
R := GetRValue(C);
G := GetGValue(C);
B := GetBValue(C);
end;