Вопрос по OpenGLControl

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

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

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Что непонятного ? :shock: Инициализация происходит при наличии OnPaint<>Nil ссылки на
Да все с тобой понятно, внимательнее поищи создание контекста. MakeCurrent дословно как переводится?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

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 выполнить.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Можно хардкорно, даже в
Можно. Если есть понимание как это работает и почему может не работать. Тсу и Alex2013 к сожалению пока так нельзя
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Во первых, в очередной раз извиняюсь за "традиционные" для меня опечатки и прочие ошибки. :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 ?
TehnikHarlan
новенький
Сообщения: 24
Зарегистрирован: 26.11.2018 15:01:35

Сообщение TehnikHarlan »

Спасибо всем за ответы и коментарии, вернусь с командировки буду пробовать. Если честно я мало что понял поскольку я не програмист а електронщик, приходится сейчас работать с машинным зрением и разработкой манипулятора, то что пишу это только для тестирования того что разработал или максимум для презентаций. А потом когда все отвечает тех. заданию и все протоколы обмена данными утверждены то комерческий софт пишут Умные люди). Так что обычно написания кода у меня начинается не с того чтоб разобраться и осознать как все работает, а в нахождение плюс минус подходящего примера и от этого плясать) Я понимаю что это плохо, именно по этому у меня такие вопросы и проблемы, но что делать на все времени не хватит.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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

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

Сообщение TehnikHarlan »

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

Спасибо за предложение, запомню) Но не в ближайшем будущем, у меня тут свой армагедон надолго, да и я не особо по програмной части таких проектов. Моя работа заключается в разработке электронных устройств.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

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

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

Отдельном потоке фризы можно свести к нулю и фопсы увеличить за 1000, c WM_PAINT таких кулс не реалити.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

olegy123, Alex2013
Какие нафиг потоки битмапы и ретрейсенги? есть раздел с флеймом, опоражняйтесь там. ненадо в технических темах рассказывать свои фантазии.
У человека элементарная проблема и ему нужно простое и правильное решение. А не чтение сказок про то что чтото у когото гдето както "работает"
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Сообщение Pavia »

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

Именно так. Надо поставить DirectX.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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:
Ответить