Alex2013 писал(а):Если заинтересует, можно будет объединить услиля .
Уверен что мне не хватит знаний и опыта чтоб хоть чем то вам помочь)
Модератор: Модераторы
Alex2013 писал(а):Если заинтересует, можно будет объединить услиля .
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;
sts писал(а):весь в сомнениях что цикл автоматически переводится в шейдеры
Alex2013 писал(а):в первый раза вижу что-бы похожим образом 2д картинку выводили
Alex2013 писал(а):А можно рабочий код целиком выложить? (можно урезанный только показ картинки ) Как-бы пиксельные шейдеры "100 лет назад придумали" но честно говоря в первый раза вижу что-бы похожим образом 2д картинку выводили ...
Щели между вершинами не мешают ?
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;  
//------------------------------------------------------------------------------------
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; 
почему не юзать gluortho2d?TehnikHarlan писал(а):А а счет пробелов между точками то их нет если не двигать камерой(gluLookAt) и на TOpenGLControl все делать 1 к 1.
TehnikHarlan писал(а):Вот рабочий код)
Вот код последнего типа рендеринга о котором я раньше говорил.

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