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