fedan, сделай OpenGLControl.MakeCurrent перед Load_GL_VERSION_3_1().
Добавлено спустя 30 секунд:
Только это можно сделать уже после создания формы...
Чем можно заменить VBO буффер?
Модератор: Модераторы
Подправил немного:
Кстати в линуксе glGetString(GL_VERSION) возвращает поддерживаемую версию OpenGL, название вендора и версию драйвера, а в окнах только версию.
Кстати в линуксе glGetString(GL_VERSION) возвращает поддерживаемую версию OpenGL, название вендора и версию драйвера, а в окнах только версию.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось fedan 11.03.2017 12:50:41, всего редактировалось 1 раз.
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.
Всё работает, но посмотрите, может что-то я сделал не совсем корректно.
Всё работает, но посмотрите, может что-то я сделал не совсем корректно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
shyub Да я сам не специалист. 
Просто прочитал пост, стало интересно. нашел через google по example glGenBuffers, пример на C и подправил под OpenGLControl.
Вот тут неплохие уроки на С++ http://www.opengl-tutorial.org/ru, http://gameinstitute.ru/uroki-opengl
Просто прочитал пост, стало интересно. нашел через google по example glGenBuffers, пример на C и подправил под OpenGLControl.
Вот тут неплохие уроки на С++ http://www.opengl-tutorial.org/ru, http://gameinstitute.ru/uroki-opengl
Одна проблема решена, появилась вторая: на 4-х ядерном процессоре простой квадрат загружает одно ядро на 50%, второе - на 75%, если использую ваш вариант. Пытался у компонента OpenGLControl1 свойство AutoResizeViewport устанавливать в false - опять же не определяется версия OpenGL. Отключаю Idle-функцию, перевожу после запуска OpenGLControl1.AutoResizeViewport:=false;, т.е. перерисовка не работает, а нагрузка на ядра не падает. Впечатление, что OpenGLControl1 имеет в своих недрах какую-то функцию, которая минуя TForm1.FormShow(Sender: TObject); беспрерывно перерисовывает экран. Надо сделать так, чтоы перерисовка производилась только при изменении размера окна или картинки.
shyub писал(а):простой квадрат загружает одно ядро на 50%, второе - на 75
Закомментировать
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
OpenGLControl1.AutoResizeViewport := true;
// Application.AddOnIdleHandler(@OnAppIdle);
end;Я вот так решил:
а после отрисовки сбрасываю флаг flagRepainGL.
А зачем вы делаете это:
если AutoResizeViewport установлен в инспекторе объектов?
Код: Выделить всё
procedure TForm1.IdleFunc(Sender: TObject; var Done: boolean);
begin
Done:=true; // true - метод вызывается при наличиии сообщений, false - постоянно.
if flagRepainGL then OpenGLControl1.Invalidate;
end;а после отрисовки сбрасываю флаг flagRepainGL.
А зачем вы делаете это:
Код: Выделить всё
OpenGLControl1.AutoResizeViewport := true;если AutoResizeViewport установлен в инспекторе объектов?
shyub писал(а):если AutoResizeViewport установлен в инспекторе объектов
Это я уже позже в инспекторе включил
