pl_OpenGL, OpenGLpanel... и.т.д

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

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение TehnikHarlan » 17.02.2021 10:32:16

Alex2013 писал(а):Если заинтересует, можно будет объединить услиля .

Уверен что мне не хватит знаний и опыта чтоб хоть чем то вам помочь)
TehnikHarlan
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2018 16:01:35

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение sts » 17.02.2021 13:52:38

если есть норм видео карта на целевой системе то лучше использовать шейдеры
давай пример рава,
я уже настроил https://github.com/anuejn/batic
прям в браузере можно шейдер писать
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение Seenkao » 17.02.2021 17:16:16

sts, я надеюсь, вы понимаете, что новичкам в OpenGL проще использовать устаревший OpenGL. Учитывая, что он устарел, то на новых видеокартах он автоматически переводится в шейдеры - эмулируется.

Опять же, знающему про эмуляцию, человеку, проще подогнать код, чтоб он работал быстрее.

Для справки, в устаревшем OpenGL (через эмуляцию) glVertex работает быстрее, чем тот же glVertexPointer. (проверено). Что именно на старых видеокартах происходит с точностью до наоборот.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: pl_OpenGL, OpenGLpanel... и.т.д

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

весь в сомнениях что цикл автоматически переводится в шейдеры

Код: Выделить всё
for j:= 0 to 959 do
             begin
              for i:= 0 to 1279 do
                begin
                 glColor3f((BYTE_FRAME[j-1,i-1])/255,
                           (BYTE_FRAME[j-1,i-1])/255,
                           (BYTE_FRAME[j-1,i-1])/255);
                 glVertex2f(-1+i/640,+1-j/480);
                end;
             end;
FormCam.OpenGLBox.SwapBuffers;


Добавлено спустя 2 минуты 22 секунды:
подозреваю обратили внимание на #version 300 es, это особенность webgl2

Добавлено спустя 8 минут 45 секунд:
для шейдера хватит 2ой версии обычного GL и карты 10летней давности
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение Alex2013 » 17.02.2021 21:14:29

А можно рабочий код целиком выложить? (можно урезанный только показ картинки ) Как-бы пиксельные шейдеры "100 лет назад придумали" но честно говоря в первый раза вижу что-бы похожим образом 2д картинку выводили ... :roll:
Щели между вершинами не мешают ?
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение Seenkao » 17.02.2021 22:30:05

sts писал(а):весь в сомнениях что цикл автоматически переводится в шейдеры

сами циклы может и не переводятся, но, видимо, какие-то переводятся и специально, как только видят определённый код.
glVertex vs glVertexPointer
Если бы это не выводилось через шейдеры, то прямой вывод ни как не мог бы обогнать по скорости вывод массивом.
Я думаю вы понимаете это.

Добавлено спустя 4 минуты 46 секунд:
Alex2013 писал(а):в первый раза вижу что-бы похожим образом 2д картинку выводили

Это допустимо. Но быстрее этот же массив закинуть в текстуру и вывести текстуру на экран, но текстуру надо будет всё равно менять постоянно...
Значит перевести в массив цветов и заранее установленный массив координат и выводить всё разом.

Щелей не будет, если выводимое окно равно изображению.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение TehnikHarlan » 22.02.2021 21:17:23

Alex2013 писал(а):А можно рабочий код целиком выложить? (можно урезанный только показ картинки ) Как-бы пиксельные шейдеры "100 лет назад придумали" но честно говоря в первый раза вижу что-бы похожим образом 2д картинку выводили ... :roll:
Щели между вершинами не мешают ?


Вот рабочий код) Не думаю что вам будет приятно в этом разбиратся но если хотите то:

Вот так получаю информацию от сенсора:
Код: Выделить всё
procedure Conection;
var
  buf : array[0..8] of byte;
  adr : smallint;

begin

   if FormCam.UDPServerCam.Active = false then
     begin
      FormCam.UDPServerCam.DefaultPort:= 2500;
      FormCam.UDPServerCam.Active:= True;
      FormCam.ButConection.Caption:= 'Відключити камеру';
      ThreadFullFrame:=FrameSynhro.Create(False); //Створюєм і запускає потік
      ThreadFullFrame.Priority:=tpNormal;
      adr :=16;
      buf[0] := 0;
      buf[1] := (adr shl 4) + 0;
      buf[2] := 0;
      buf[3] := 0;
      buf[4] := 0;
      buf[5] := 0;
      buf[6] := 0;
      buf[7] := 0;
      buf[8] := ByteDenNich;
     FormCam.UDPServerCam.SendBuffer('192.168.0.10', 2500, buf);
      exit;
     end
   else
     begin
      FormCam.UDPServerCam.Active:= False;
      FormCam.ButConection.Caption:='Підключити камеру';
      ThreadFullFrame.Terminate;     // ставим признак завершення потоку
      exit;
     end;
end; 

// ----------------------------------------------------------------------------
procedure TFormCam.UDPServerCamUDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  if DOZVILREAD = true then
  ReadVideoString(AData);

end; 



///----------------------------------------------------------------------

function ReadVideoString(VideoString:TIdBytes): integer;
var
   i,numstr: integer;
begin
      numstr:= 0;
      numstr:= numstr+ VideoString[1];
      numstr:= numstr+ ((VideoString[0]) shl 8);
      { з перших двох байт AData формується
        номер відеостроки(положення даного пакету у двомірному массиві)   }

     if numstr <= 979 then
      begin
        for i:= 0 to 1287 do
         begin
           BYTE_FRAME[numstr,i]:= VideoString[i+2];
         end;
      end;
     SYNHRO:= numstr;
     Result:= numstr;
end; 
//------------------------------------------------------------------------------------


Отдельный поток занимается отслеживанием получения полного кадра и запускает вывод изображения взависимости от необходимого способа рендеригнга TYPERENDER
Код: Выделить всё
unit FrameRate;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;
type

  { MyThread }

  FrameSynhro=class(TThread)
private
  results:integer;
public
  procedure ShowResult;
  procedure Execute; override;
end;


implementation
uses
  MainUnit, UnitService;

{ MyThread }

procedure FrameSynhro.ShowResult;
begin
     case TYPERENDER of
      0: ShowImmediately;
      1: ShowImmediatelyColor;
      2: ShowImmediatelyInterpolation;
      3: ShowImmediatelyInterpolation1;
      4: ShowImmediatelyInterpolation2;
      5: ShowImmediatelyInterpolation3;
      6: ShowImmediatelyInterpolation4;
      7: ShowImmediatelyInterpolation5;
     end;


end;

procedure FrameSynhro.Execute;
begin
  while not Terminated do
  begin
    if (SYNHRO = 1) then
      begin
      Synchronize(@ShowResult);
      SYNHRO :=0 ;
      end;
    end;
end;

end.


Вот код последнего типа рендеринга о котором я раньше говорил.

Код: Выделить всё
procedure ShowImmediatelyInterpolation5;
var i,j: integer;
    k,n: integer;
    chagepix: boolean;
    jar : real;
    tempbyte : integer;
begin

          for j:= 0 to 976 do
               begin
                for i:= 0 to 1288 do
                  begin
                     BYTE_FRAME_COMPLIT[j,i]:= BYTE_FRAME[j,i];
                  end;
               end;

              j:=1; i:=1; k:=0; n:=0;
               glClearColor(0/255, 0/255, 0/255, 1);
               chagepix := true;
                jar :=1;
                { колір очищення відеобуфурів вибраний такий
                  самий як колір вікна форми, щоб не було видно
                  зайвих областей кругом відеовікна,
                  які не використовуються }

                glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // очищення буферів


                      {================== Початок заповнення кадру ===============}
                      {==================}  glBegin(GL_POINTS); {==================}
                      {================== Початок заповнення кадру ===============}
                 for j:= 0 to 957 do
                  begin
                   for i:= 0 to 1275 do
                     begin
                          if BYTE_FRAME_COMPLIT[j+4, i+2] > 127 then
                            begin
                             tempbyte:= round((BYTE_FRAME_COMPLIT[j+4, i+2] - 127) * KONTRmnog + 127);
                             if tempbyte >255 then tempbyte := 255;
                             if tempbyte < 0 then tempbyte := 0;
                             BYTE_FRAME_COMPLIT[j+4, i+2] :=  tempbyte;
                            end;

                          if BYTE_FRAME[j+4, i+2] < 127 then
                            begin
                             tempbyte := round((BYTE_FRAME_COMPLIT[j+4, i+2] - 127) * KONTRmnog2 + 127);
                             if tempbyte >255 then tempbyte := 255;
                             if tempbyte < 0 then tempbyte := 0;
                             BYTE_FRAME_COMPLIT[j+4, i+2] :=  tempbyte;
                            end;




                     end;
                  end;

                  j:=1; i:=1; k:=0; n:=0;

                      while j<960 do
                       begin
                        if(j mod 2 <> 0) then
                         begin
                          while i< 1280 do
                            begin
                                    if (i mod 2 = 0) then
                                     begin
                                      jar := (  KR*(MN*0.5*(BYTE_FRAME_COMPLIT[k+1,n]/255+ BYTE_FRAME_COMPLIT[k+1,n+2]/255))+
                                                KG*(MN*BYTE_FRAME_COMPLIT[k+1,n+1]/255)+
                                                KB*(MN*0.5*(BYTE_FRAME_COMPLIT[k,n+1]/255+ BYTE_FRAME_COMPLIT[k+2,n+1]/255)));
                                      glColor3f(jar,jar,jar);

                                                 glVertex2f(-1+n/640,+1-k/480);

                                                 i:= i+1; n:= n+1;
                                     end
                                    else
                                     begin
                                      jar := (   KR*(MN*BYTE_FRAME_COMPLIT[k+1,n+1]/255)+
                                                 KG*(MN*0.25*(BYTE_FRAME_COMPLIT[k,n+1]/255 +BYTE_FRAME_COMPLIT[k+1,n+2]/255+BYTE_FRAME_COMPLIT[k+2,n+1]/255 + BYTE_FRAME_COMPLIT[k+1,n]/255))+
                                                 KB*(MN*0.25*(BYTE_FRAME_COMPLIT[k,n]/255+ BYTE_FRAME_COMPLIT[k,n+2]/255 + BYTE_FRAME_COMPLIT[k+2,n]/255 + BYTE_FRAME_COMPLIT[k+2,n+2]/255)));
                                     glColor3f(jar,jar,jar);

                                                 glVertex2f(-1+n/640,+1-k/480);

                                                 i:= i+1; n:= n+1;
                                     end;
                            end;
                          end
                            else
                             begin
                              while i< 1280 do
                               begin
                                    if (i mod 2 = 0) then
                                     begin
                                      jar := (    KR*(MN*0.25*(BYTE_FRAME_COMPLIT[k,n]/255 + BYTE_FRAME_COMPLIT[k,n+2]/255 + BYTE_FRAME_COMPLIT[k+2,n]/255 + BYTE_FRAME_COMPLIT[k+2,n+2]/255))+
                                                  KG*(MN*0.25*(BYTE_FRAME_COMPLIT[k+1,n]/255 + BYTE_FRAME_COMPLIT[k+1,n+2]/255 + BYTE_FRAME_COMPLIT[k,n+1]/255 + BYTE_FRAME_COMPLIT[k+2,n+1]/255))+
                                                  KB*(MN*BYTE_FRAME_COMPLIT[k+1,n+1]/255));
                                      glColor3f(jar,jar,jar);

                                                 glVertex2f(-1+n/640,+1-k/480);

                                                 i:= i+1; n:= n+1;
                                     end
                                    else
                                     begin
                                      jar := (       KR*(MN*0.5*(BYTE_FRAME_COMPLIT[k,n+1]/255+ BYTE_FRAME_COMPLIT[k+2,n+1]/255))+
                                                     KG*(MN*BYTE_FRAME_COMPLIT[k+1,n+1]/255)+
                                                     KB*(MN*0.5*(BYTE_FRAME_COMPLIT[k+1,n]/255+ BYTE_FRAME_COMPLIT[k+1,n+2]/255)));
                                         glColor3f(jar,jar,jar);

                                                 glVertex2f(-1+n/640,+1-k/480);

                                                 i:= i+1; n:= n+1;
                                     end;
                              end;
                             end;

                           i := 0; n := 0;
                           j := j+1; k := k+1;
                       end;
                        j := 0;  k := 0;



                      {================== Кінець заповнення кадру ===============}
                      {==================}         glEnd;      {==================}
                      {================== Кінець заповнення кадру ===============}

                      FormCam.OpenGLBox.SwapBuffers;
end;


И это не судите строго, я просто делаю для себя технологические програмы для проверки того что разработал и спаял ну и демонстрации своей работы начальству или клиенту)

А а счет пробелов между точками то их нет если не двигать камерой(gluLookAt) и на TOpenGLControl все делать 1 к 1.
TehnikHarlan
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2018 16:01:35

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение olegy123 » 22.02.2021 22:05:51

Советую использовать PBO Pixel Buffer Objectдля загонки битмапа в текстуру. Гнать можно спокойно размер HD более 30fps, все зависит от скорости шины PCIe.
4К сложнее, там нужно битмапить уже в текстуру через аппаратные кодэки.

Добавлено спустя 6 минут 25 секунд:
TehnikHarlan писал(а):А а счет пробелов между точками то их нет если не двигать камерой(gluLookAt) и на TOpenGLControl все делать 1 к 1.
почему не юзать gluortho2d?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: pl_OpenGL, OpenGLpanel... и.т.д

Сообщение Alex2013 » 23.02.2021 03:40:56

TehnikHarlan писал(а):Вот рабочий код)

Спасибо ! Посмотрю ...

Вот код последнего типа рендеринга о котором я раньше говорил.

Именно на него я и хотел глянуть . :idea:

Добавлено спустя 21 минуту 6 секунд:
olegy123 писал(а):Советую использовать PBO Pixel Buffer Objectдля загонки битмапа в текстуру. Гнать можно спокойно размер HD более 30fps, все зависит от скорости шины PCIe.
4К сложнее, там нужно битмапить уже в текстуру через аппаратные кодэки.

Добавлено спустя 6 минут 25 секунд:
TehnikHarlan писал(а):А а счет пробелов между точками то их нет если не двигать камерой(gluLookAt) и на TOpenGLControl все делать 1 к 1.
почему не юзать gluortho2d?

1 По PBO Pixel Buffer Object: не совсем понятно для чего может понадобится именно асинхронная загрузка-выгрузка но все равно интересно.
2 "если не двигать камерой" ? В моем текущем проекте это практически невозможно (ВиАр все-же!) Естественное что приходит в голову это "задать толщину точки", но как это будет работать не совсем ясно .
( Можно сещать объекты в место смещения камеры или "изощряться" на уровне матрицы пространственных преобразований но это по сути то же самое )
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Компоненты

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

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

Рейтинг@Mail.ru