Вопрос по OpenGLControl

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

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

Re: Вопрос по OpenGLControl

Сообщение zub » 04.09.2019 05:16:44

>>Что непонятного ? :shock: Инициализация происходит при наличии OnPaint<>Nil ссылки на
Да все с тобой понятно, внимательнее поищи создание контекста. MakeCurrent дословно как переводится?
zub
долгожитель
 
Сообщения: 2515
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопрос по OpenGLControl

Сообщение olegy123 » 04.09.2019 05:57:36

TehnikHarlan писал(а):procedure TForm1.FormCreate(Sender: TObject);
begin

glClearColor(220/255, 220/255, 220/255, 1); //задаю цвет

Контекст GL окна еще не создался, система вообще не вкурсе что где то есть GL окно. Не знает кому предназначены GL команды, соответственно драйвер игнорирует их.

Добавлено спустя 10 минут 26 секунд:
Alex2013 писал(а):Проверил "пустая процедура" действительно работает . ( Возможно в старой версии DC получали при создании OpenGLContro-а или в программе все-же была рабочая ссылка в OpenGLControl1.OnPaint )

Короче GL контекст тесно связан с визуальным окном(Handle) так драйвер определяет кто сейчас рисует и куда результат отправлять.. В системе могут быть больше GL-окон, так как железо способно рисовать только один контекст одновременно, а окон может быть больше одного, то драйверу необходимо переключится на заданный контекст и подгрузить параметры для текущего окна - актуализировать. Но в самом окне (TWindow) могут быть больше GL одного окна (GLконтекста) поэтому нужно актуализировать его MakeCurrent, или выключить через Nil параметр.

Добавлено спустя 3 минуты 27 секунд:
GL команды будут работать при правильном Handle(Twindow) созданным GL контексте и активированным через MakeCurrent, в иных случаях драйвер посчитает что "ошиблись дверью".

Добавлено спустя 8 минут 20 секунд:
zub писал(а): В OnPaint контрола рисовать то что надо.

это по простому, OpenGLControl уже продумали включать контекст и наверно! выключать его когда вызывается OnPaint.
Можно хардкорно, даже в TThread, без няшных OnPaint, тем самым FPS поднять до мегагерцев - а не ждать когда Message прилетить в окно чтобы OnPaint выполнить.
olegy123
энтузиаст
 
Сообщения: 1473
Зарегистрирован: 25.02.2016 12:10:20

Re: Вопрос по OpenGLControl

Сообщение zub » 04.09.2019 08:26:31

>>Можно хардкорно, даже в
Можно. Если есть понимание как это работает и почему может не работать. Тсу и Alex2013 к сожалению пока так нельзя
zub
долгожитель
 
Сообщения: 2515
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопрос по OpenGLControl

Сообщение Alex2013 » 04.09.2019 12:55:50

Во первых, в очередной раз извиняюсь за "традиционные" для меня опечатки и прочие ошибки. :oops:

zub писал(а):Можно. Если есть понимание как это работает и почему может не работать.

Тут согласен на все 100% .
olegy123 писал(а):Можно хардкорно, даже в TThread, без няшных OnPaint


Хм, причем тут поток ? Просто можно инициализировать API-OpenGL в обход OpenGLControl (Что я и делаю при "выводе на битмап" )
Код: Выделить всё
procedure Draw3DModel(OutX,OutY,W,H,T,Ax,Ay,Az: Integer;Var OutBMP:TBitmap );
const  ScrBitmap:TBitmap=nil;
Var  Sx,Sy:Longint;
        hrc:HDC;

procedure Init;

const
light_diffuse : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 0.0);
light_specular : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 0.0);
mat_specular : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 1.0);
lmodel_ambient : Array [0..3] of GLfloat = (0.0, 0.0, 0.0, 0.0);
mat_shininess : GLfloat = 50.0;
var
CanvasHandle:HDC;
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
FormatIndex: Integer;
lFDC: HDC;
ps : TPaintStruct;
b:TBitMap;
begin
if ScrBitmap=nil then begin  ScrBitmap:=TBitmap.Create;
  Sx:=500;Sy:=500; //Speed:=2;
  ScrBitmap.PixelFormat:=pf24bit;ScrBitmap.Canvas.Brush.Color:=0;
  ScrBitmap.SetSize(500,500);
end;
  lFDC := ScrBitmap.Canvas.Handle;
  FillChar(PFD, SizeOf(PFD), 0);
    With PFD do begin
    nSize := SizeOf(PFD);   nVersion := 1;
    dwFlags := pfd_Draw_to_Bitmap or pfd_Support_OpenGL
    or    PFD_GENERIC_ACCELERATED;
    iPixelType := pfd_Type_RGBA;
    cColorBits := 24;    cDepthBits := 32;
    iLayerType := pfd_Main_Plane;
    end;
  FormatIndex := ChoosePixelFormat(lFDC, @PFD);
  SetPixelFormat(lFDC, FormatIndex, @PFD);
  HRC := wglCreateContext(lFDC);
  wglMakeCurrent(lFDC, HRC);

glEnable(GL_DEPTH_TEST);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, @light_specular);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColor3f(1.5, 1.5, 1.5);
glViewport(0, 0, ScrBitmap.Width, ScrBitmap.Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;

glFrustum(-1.0, 1.0, -1.0, 1.0, 50.0, 300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-50.0, -50.0, -250.0);

end;


procedure WMPaint;
var
ps : TPaintStruct;
b:TBitMap;
MM:Real;
begin
Init; //Инициализация битмапа

// Стандартная настройка OpenGL (Обычный OpenGL код )
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//... У меня там куча тестового и закомментированного кода так что "замну для ясности" 

// Тут идет "универсальная" загрузка модели 
  Load3e.OGL_DrawLoad3e(0,0,100,nil);
//----------------------------------------------------
   glPopMatrix;
   glFlush;// вместо  SwapBuferrs
   wglDeleteContext(hrc);
end;
var B,buf,buf2:TBitMap;
begin
WMPaint;
B:= ScrBitmap;
....
end;

Зы
Кстати это получается, что по умолчанию в одной форме может быть только один OpenGLControl ?
Alex2013
энтузиаст
 
Сообщения: 1495
Зарегистрирован: 03.04.2013 11:59:44

Re: Вопрос по OpenGLControl

Сообщение TehnikHarlan » 04.09.2019 20:06:37

Спасибо всем за ответы и коментарии, вернусь с командировки буду пробовать. Если честно я мало что понял поскольку я не програмист а електронщик, приходится сейчас работать с машинным зрением и разработкой манипулятора, то что пишу это только для тестирования того что разработал или максимум для презентаций. А потом когда все отвечает тех. заданию и все протоколы обмена данными утверждены то комерческий софт пишут Умные люди). Так что обычно написания кода у меня начинается не с того чтоб разобраться и осознать как все работает, а в нахождение плюс минус подходящего примера и от этого плясать) Я понимаю что это плохо, именно по этому у меня такие вопросы и проблемы, но что делать на все времени не хватит.
TehnikHarlan
новенький
 
Сообщения: 16
Зарегистрирован: 26.11.2018 16:01:35

Re: Вопрос по OpenGLControl

Сообщение Alex2013 » 04.09.2019 20:44:41

приходится сейчас работать с машинным зрением

О это интересно! У меня тут на форуме базовый болг проекта (к сожалению довольно "вялотекущего" ) цель которого создание своего интерфейса в дополненной реальности.
Исследовательский проект "Цифровая оптика" .
По моему достаточно близкая тема что-бы прорабатывать как-то скооперироваться. Как идея ? :idea:
Последний раз редактировалось Alex2013 09.09.2019 01:08:11, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 1495
Зарегистрирован: 03.04.2013 11:59:44

Re: Вопрос по OpenGLControl

Сообщение TehnikHarlan » 04.09.2019 23:33:32

По моему достаточно близкая тема что-бы прорабатывать как-то скооперироваться. Как идея ?

Спасибо за предложение, запомню) Но не в ближайшем будущем, у меня тут свой армагедон надолго, да и я не особо по програмной части таких проектов. Моя работа заключается в разработке электронных устройств.
TehnikHarlan
новенький
 
Сообщения: 16
Зарегистрирован: 26.11.2018 16:01:35

Re: Вопрос по OpenGLControl

Сообщение olegy123 » 05.09.2019 12:14:38

Alex2013 писал(а):Хм, причем тут поток ? Просто можно инициализировать API-OpenGL в обход OpenGLControl (Что я и делаю при "выводе на битмап" )

Можно и без использования OpenGL/DirectX попиксельно - Ray tracing.

Отдельном потоке фризы можно свести к нулю и фопсы увеличить за 1000, c WM_PAINT таких кулс не реалити.
olegy123
энтузиаст
 
Сообщения: 1473
Зарегистрирован: 25.02.2016 12:10:20

Re: Вопрос по OpenGLControl

Сообщение zub » 05.09.2019 12:47:30

olegy123, Alex2013
Какие нафиг потоки битмапы и ретрейсенги? есть раздел с флеймом, опоражняйтесь там. ненадо в технических темах рассказывать свои фантазии.
У человека элементарная проблема и ему нужно простое и правильное решение. А не чтение сказок про то что чтото у когото гдето както "работает"
zub
долгожитель
 
Сообщения: 2515
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопрос по OpenGLControl

Сообщение Pavia » 05.09.2019 22:34:10

TehnikHarlan писал(а):Я под виндовс 10, через cmd запустилось да и все) ниче не написало. Кстате принесенное откомпилированое тестовое приложение с нового компа на старий, заработало на старом) Может не хватает каких то компонентов для свежоустановленого вин 10 на новом компютере?)

Именно так. Надо поставить DirectX.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 218
Зарегистрирован: 07.01.2011 12:46:51

Re: Вопрос по OpenGLControl

Сообщение Alex2013 » 06.09.2019 00:30:52

zub писал(а):olegy123, Alex2013
У человека элементарная проблема и ему нужно простое и правильное решение.


ТС уже более менее помогли - дальше он уже сам должен проверить что ему предложили .
И это точно "то самое, простое решение", а то что обсуждение вильнуло на "дровяной склад" так это общее свойство подобных форумов, где людям интересно не только решение конкретной задачи, но и обсуждение "смежных тем".( Тем более что пока все в рамках двух трех постов и ТС вполне доволен ходом обсуждения )

Добавлено спустя 3 минуты 5 секунд:
olegy123 писал(а):Отдельном потоке фризы можно свести к нулю и фопсы увеличить за 1000, c WM_PAINT таких кулс не реалити.

ИМХО: В потоке хорошо готовить данные и делать расчеты , но плохо вызвать любые "посторонние " функции API а WM_PAINT для OpenGl вообще побоку "Загрузка данных в сцену" может происходить в любой момент по мере готовности данных и основной цикл их подготовки вполне может крутится в пределах основного потока .
WM_PAINT Чисто "резервная подстраховка" для неурочного освежения картинки при разных "обстоятельствах непреодолимой силы " вроде изменения размера окна

Pavia писал(а):Именно так. Надо поставить DirectX.

Вполне возможно ... Но у меня DirectX( DirectX Version: DirectX 12) точно стоит, а исходный пример ТС (без обработчика WM_PAINT) все равно не работает . Возможно фокус в Винде у меня тут сейчас Windows 10 Корпоративная 64-bit

Добавлено спустя 15 минут 59 секунд:
TehnikHarlan писал(а):
По моему достаточно близкая тема что-бы прорабатывать как-то скооперироваться. Как идея ?

Спасибо за предложение, запомню) Но не в ближайшем будущем, у меня тут свой армагедон надолго, да и я не особо по програмной части таких проектов. Моя работа заключается в разработке электронных устройств.

Ну что-ж тогда желаю успехов в скорейшем преодолении "армагедона" ! :idea:
Alex2013
энтузиаст
 
Сообщения: 1495
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 3

Рейтинг@Mail.ru