Рисование на Canvas. Плохая графика без OpenGL.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Sergey1979 » 13.05.2022 09:04:52

Всем привет!

Решил сделать небольшую графическую программу на Lazarus 2.2.0 / FPC 3.2.2 / Windows 11.
Как получить графику хорошего уровня не прибегая к OpenGL ?
Линии с "зазубринами", шрифты не сглажены.

Вот тестовый пример:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  // рисуем линию
  Canvas.Pen.Color := clRed;
  Canvas.Line(0, 0, Width, Height);
end;


Получаем не сглаженную линию с зазубринами.
Кнопка хорошо прорисовалась, а вот линия нет.
TestLine.jpg


Пожалуйста, подскажите решение, желательно без OpenGL.
Заранее спасибо!

Сергей.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Sergey1979
незнакомец
 
Сообщения: 2
Зарегистрирован: 13.05.2022 08:44:41

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Shleps » 13.05.2022 21:27:46

У меня лазарус 1.6.4 fpc 3.0.2 WinXP
Изображение
зазубрины не превышают 1 пикселя, как и у ворда, и у всего прочего
Аватара пользователя
Shleps
постоялец
 
Сообщения: 178
Зарегистрирован: 14.06.2006 20:25:14

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Sharfik » 14.05.2022 02:11:41

Shleps писал(а):зазубрины не превышают 1 пикселя, как и у ворда, и у всего прочего

Это достаточно фигово смотрится и глазам неприятно. В начале разработки сойдет, но потом все же лишнее. Особенно если с программой люди долго работать будут. Я бы вот очень хотел знать как повторить визуальное восприятие линий как в yed Grath editor.

Sergey1979 писал(а):Как получить графику хорошего уровня не прибегая к OpenGL ?

Я до конца не разобрался, но даже с просто заменой Canvas на BGRACanvas линии приятнее. Пример с исходниками мой тут viewtopic.php?f=32&t=43425
или ищи в интернете. Примеров по BGRA мало, но есть.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 652
Зарегистрирован: 20.07.2013 01:04:30

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Shleps » 14.05.2022 11:02:53

Sharfik писал(а): Я бы вот очень хотел знать как повторить визуальное восприятие линий как в yed Grath editor.

Была такая книжка - "таинства программирования машинной графики"
там всякие фокусы на эту тему описаны.
например виртуальное удвоение разрешения, а потом сглаживание цвета через усреднение и вывод на физический экран.
при этом мелкие объекты будут мутные. и на некоторых технологиях мониторов надо учитывать расположение R G B компонентов пискеля.
В линуксе это в драйвера вынесли и в настройки вывода шрифтов - никто не рискнул хардкодить прямо в приложения.
Аватара пользователя
Shleps
постоялец
 
Сообщения: 178
Зарегистрирован: 14.06.2006 20:25:14

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Sergey1979 » 14.05.2022 11:22:27

Sharfik писал(а):с просто заменой Canvas на BGRACanvas линии приятнее


По BGRAControls нашел еще информацию: https://wiki.freepascal.org/BGRAControls/ru
Sergey1979
незнакомец
 
Сообщения: 2
Зарегистрирован: 13.05.2022 08:44:41

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Alex2013 » 14.05.2022 12:42:16

Можно рисовать на битмапе и юзать простой фильтр сглаживания
Вроде этого.
Код: Выделить всё
// простое сглаживание .... не "по Гаусу" но зато быстро.
procedure SplitBlur(var Clip: TBitmap; Amount: integer);
var P0,P1,P2: PByteArray;
    CX,X,Y: integer;
    Buf: array [0..3,0..2] of byte;
begin
  if Amount=0 then Exit;
     Clip.BeginUpdate(False);

  for Y:=0 to pred(Clip.Height) do
    begin
      P0:=Clip.ScanLine[Y];
      if Y-Amount<0 then P1:=Clip.ScanLine[Y] else P1:=Clip.ScanLine[Y-Amount]; {Y-Amount>0}
      if Y+Amount<Clip.Height then P2:=Clip.ScanLine[Y+Amount] else P2:=Clip.ScanLine[Clip.Height-Y]; {Y+Amount>=Height}
      for X:=0 to pred(Clip.Width) do
        begin
          if X-Amount<0 then CX:=X else CX:=X-Amount; {X-Amount>0}
          Buf[0,0]:=P1[CX*3];
          Buf[0,1]:=P1[CX*3+1];
          Buf[0,2]:=P1[CX*3+2];
          Buf[1,0]:=P2[CX*3];
          Buf[1,1]:=P2[CX*3+1];
          Buf[1,2]:=P2[CX*3+2];
          if X+Amount<Clip.Width then CX:=X+Amount else CX:=Clip.Width-X; {X+Amount>=Width}
          Buf[2,0]:=P1[CX*3];
          Buf[2,1]:=P1[CX*3+1];
          Buf[2,2]:=P1[CX*3+2];
          Buf[3,0]:=P2[CX*3];
          Buf[3,1]:=P2[CX*3+1];
          Buf[3,2]:=P2[CX*3+2];
          P0[X*3]:=(Buf[0,0]+Buf[1,0]+Buf[2,0]+Buf[3,0]) shr 2;
          P0[X*3+1]:=(Buf[0,1]+Buf[1,1]+Buf[2,1]+Buf[3,1]) shr 2;
          P0[X*3+2]:=(Buf[0,2]+Buf[1,2]+Buf[2,2]+Buf[3,2]) shr 2;
        end;
    end;
  Clip.EndUpdate(False);
end;


...или этого.
Код: Выделить всё
//******************************
//АнтиАляйзинг

procedure AntiAliasRect(var Clip: TBitmap; XOrigin,YOrigin,XFinal,YFinal: integer);
var Memo,X,Y: integer; (* Composantes primaires des points environnants *)
    P0,P1,P2: PByteArray;
begin
   if XFinal<XOrigin then
     begin
       Memo:=XOrigin;
       XOrigin:=XFinal;
       XFinal:=Memo;
     end;  (* Inversion des valeurs   *)
   if YFinal<YOrigin then
     begin
       Memo:=YOrigin;
       YOrigin:=YFinal;
       YFinal:=Memo;
     end;  (* si diff‚rence n‚gative*)
   XOrigin:=Max(1,XOrigin);
   YOrigin:=Max(1,YOrigin);
   XFinal:=Min(Clip.Width-2,XFinal);
   YFinal:=Min(Clip.Height-2,YFinal);
   //Clip.PixelFormat:=pf24bit;
   for Y:=YOrigin to YFinal do
     begin
     Clip.BeginUpdate(False);
       P0:=Clip.ScanLine[Y-1];
       P1:=Clip.ScanLine[Y];
       P2:=Clip.ScanLine[Y+1];
       for X:=XOrigin to XFinal do
         begin
           P1[X*3]:=(P0[X*3]+P2[X*3]+P1[(X-1)*3]+P1[(x+1)*3]) div 4;
           P1[X*3+1]:=(P0[X*3+1]+P2[X*3+1]+P1[(X-1)*3+1]+P1[(X+1)*3+1]) div 4;
           P1[X*3+2]:=(P0[X*3+2]+P2[X*3+2]+P1[(X-1)*3+2]+P1[(X+1)*3+2]) div 4;
         end;
       Clip.EndUpdate(False);
     end;
end;
Alex2013
долгожитель
 
Сообщения: 2510
Зарегистрирован: 03.04.2013 11:59:44

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение Sharfik » 16.05.2022 00:03:50

Alex2013 спасибо, посмотрю.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 652
Зарегистрирован: 20.07.2013 01:04:30

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение sts » 16.05.2022 16:09:17

если только под винду - используйте gdiplus либу

Добавлено спустя 8 минут 7 секунд:
типа такого github.com/wyrover/delphi-gdiplus-examples
(не проверял)
либо чтото кроссплат. типа wiki.lazarus.freepascal.org/fpGUI взять оттуда рисование

Добавлено спустя 10 минут 30 секунд:
во, даже есть либа agg (en.wikipedia.org/wiki/Anti-Grain_Geometry)
lazarus/lcl/interfaces/fpgui/src/corelib/render/software

Добавлено спустя 2 минуты 25 секунд:
sts писал(а):используйте gdiplus либу

кстати сама использует аппаратное ускорение 2д если драйвера видюхи нормально написаны
sts
постоялец
 
Сообщения: 315
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение zub » 16.05.2022 18:56:21

gdiplus давно уже не ускоряется
вот результат теста рисования линий на квадре (хоть и старая, но драйвера - нормальней не найти)
OpenGL driver info: NVIDIA Corporation Quadro M5000/PCIe/SSE2 4.6.0 NVIDIA 471.41
Draw 10000 random lines
Canvas: 27msec
GDIPlus: 720msec
AGG: 538msec
OpenGL: 3msec
GDI: 25msec

в данном тесте линии agg и gdiplus антиалиаснутые, осталные без сглаживания

Добавлено спустя 5 минут 20 секунд:
штатный opengl емнип неумеет сглаживать обычные линии, это реализовано расширениями доступными только в проф. картах, либо хитрить рисуя линию треугольниками с текстурой (читал гдето про такое, но не пробовал, такчто может вру)

Добавлено спустя 1 минуту 46 секунд:
имею ввиду старый opengl, без шейдеров
zub
долгожитель
 
Сообщения: 2842
Зарегистрирован: 14.11.2005 23:51:26

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение sts » 16.05.2022 19:17:30

а винда какая?

docs.microsoft.com/ru-ru/windows/win32/direct2d/comparing-direct2d-and-gdi

win7 включительно - можно GDI
младше - direct2d

эх, вот м..нехорошие люди, а все этот уродский DWM, на 10ке его даже отключить нельзя, проги просто не умеют без буфера отрисовываться.
sts
постоялец
 
Сообщения: 315
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Рисование на Canvas. Плохая графика без OpenGL.

Сообщение zub » 16.05.2022 19:20:19

>>а винда какая?
на данный момент 11, в 10 аналогично.
в 7 не помню, помоему тоже не ускорялся

>>вот м..нехорошие люди
не могу не согласиться
zub
долгожитель
 
Сообщения: 2842
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru