Чем можно заменить VBO буффер?

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

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

Osmiy
новенький
Сообщения: 46
Зарегистрирован: 07.05.2016 20:18:39

Сообщение Osmiy »

fedan, сделай OpenGLControl.MakeCurrent перед Load_GL_VERSION_3_1().

Добавлено спустя 30 секунд:
Только это можно сделать уже после создания формы...
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Сообщение fedan »

Подправил немного:
simple_vbo.zip

Кстати в линуксе glGetString(GL_VERSION) возвращает поддерживаемую версию OpenGL, название вендора и версию драйвера, а в окнах только версию.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось fedan 11.03.2017 12:50:41, всего редактировалось 1 раз.
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение shyub »

Fedan, очень понравился ваш вариант. OpenGL я изучал по книге "OpenGL в Delphi" М.Краснов. 2000 г., а VBO по этой подборке статей: http://vbomesh.blogspot.com/2012/02/vbo-opengl.html. Применительно к моим задачам мне необходимо будет отображать объёмные детали и иметь возможность просмотра их с разных сторон, поэтому немного изменил ваш код. И второе. На https://ru.wikipedia.org/wiki/Vertex_Buffer_Object пишут, что BindBuffer поддерживаетс начиная с версии OpenGL 2.1 (до этого была процедура BindBufferARB). Мало вероятно, что у кого-то окажется версия ниже, но тем не менее я изменил инициализацию с 1.5 на 2.1.
Всё работает, но посмотрите, может что-то я сделал не совсем корректно.
simple_vbo_Windows.rar
У вас нет необходимых прав для просмотра вложений в этом сообщении.
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Сообщение fedan »

shyub Да я сам не специалист. :D
Просто прочитал пост, стало интересно. нашел через google по example glGenBuffers, пример на C и подправил под OpenGLControl.
Вот тут неплохие уроки на С++ http://www.opengl-tutorial.org/ru, http://gameinstitute.ru/uroki-opengl
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение shyub »

Одна проблема решена, появилась вторая: на 4-х ядерном процессоре простой квадрат загружает одно ядро на 50%, второе - на 75%, если использую ваш вариант. Пытался у компонента OpenGLControl1 свойство AutoResizeViewport устанавливать в false - опять же не определяется версия OpenGL. Отключаю Idle-функцию, перевожу после запуска OpenGLControl1.AutoResizeViewport:=false;, т.е. перерисовка не работает, а нагрузка на ядра не падает. Впечатление, что OpenGLControl1 имеет в своих недрах какую-то функцию, которая минуя TForm1.FormShow(Sender: TObject); беспрерывно перерисовывает экран. Надо сделать так, чтоы перерисовка производилась только при изменении размера окна или картинки.
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Сообщение fedan »

shyub писал(а):простой квадрат загружает одно ядро на 50%, второе - на 75


Закомментировать

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenGLControl1.AutoResizeViewport := true;
//  Application.AddOnIdleHandler(@OnAppIdle);
end;
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение shyub »

Я вот так решил:

Код: Выделить всё

procedure TForm1.IdleFunc(Sender: TObject; var Done: boolean);
begin
  Done:=true; // true - метод вызывается при наличиии сообщений, false - постоянно.
  if flagRepainGL then OpenGLControl1.Invalidate;
end;

а после отрисовки сбрасываю флаг flagRepainGL.
А зачем вы делаете это:

Код: Выделить всё

OpenGLControl1.AutoResizeViewport := true;

если AutoResizeViewport установлен в инспекторе объектов?
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Сообщение fedan »

shyub писал(а):если AutoResizeViewport установлен в инспекторе объектов


Это я уже позже в инспекторе включил :D
Ответить