Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывода битмапа по маске и под углом [D7, XP]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо