Показаны сообщения с ярлыком GLUT. Показать все сообщения
Показаны сообщения с ярлыком GLUT. Показать все сообщения

среда, 9 мая 2018 г.

Подключаем Freeglut к Visual Studo С++ 2010 Express

1. Скачиваем библиотеку Freeglut с сайта члена сообщества Freeglut, который произвел бинарный пакет под Windows https://www.transmissionzero.co.uk/files/software/development/GLUT/freeglut-MSVC.zip

2. Распакуйте скаченный архив в папку, где вас расположены все библиотеки для разработки (Например, D:\Projects\libs\freeglut_msvc_3_0_0_2)

3. Запустите Vusual Studio C++ 2010 Express и создайте пустой проект. Для этого выберите пункт меню Файл -> Создать -> Проект (Смотрите рисунок 1). Сохраните проект, например D:\Projects\vsprojects\freeglut\. Проект назовите, например freeglut_p1 (Смотрите рисунок 2).

Рисунок 1. Открытие окна создания нового проекта

Рисунок 2. Окно создания нового проекта

4. Добавьте в только-что созданный проект файл исходного кода, например файл main.cpp. Для этого в обозревателе решений выберите правой кнопкой мыши раздел "Файлы исходного кода". Далее выберите пункт меню Добавить -> Создать элемент (Смотрите рисунок 3 и рисунок 4). 

Рисунок 3. Добавление в проект файла исходного кода

Рисунок 4. Окно добавления файла исходного кода

5. Теперь перейдем в свойства проекта и укажем нашему проекту где находится библиотека Freeglut. Для этого выберите пункт меню Проект -> Свойства: freeglut_p1 (Смотрите рисунок 5). В окне Страницы свойств выбирайте раздел Свойства конфигурации - С/С++ - Общие и в свойстве "Дополнительные каталоги включаемых файлов" укажите путь до включаемых файлов библиотеки Freeglut, например D:\Projects\libs\freeglut_msvc_3_0_0_2\include (Смотрите рисунок 6). Далее в окне Страницы свойств выбираете раздел Свойства конфигурации - Компоновщик - Общие  и в свойстве "Дополнительные каталоги библиотек" укажите путь до катлога статических библиотек (файл lib) библиотеки Freeglut, например D:\Projects\libs\freeglut_msvc_3_0_0_2\lib (Смотрите рисунок 7). Далее в окне Страницы свойств выбираете раздел Свойства конфигурации - Компоновщик - Ввод и в свойстве "Дополнительные зависимости" укажите название файла статической библиотеки freeglut.lib (Смотрите рисунок 8).

Рисунок 5. Открытие окна свойств проекта

Рисунок 6. Указание пути включаемых файлов в свойствах проекта

Рисунок 7. Указание пути файлов статических библиотек в свойствах проекта

Рисунок 8. Указание название файла статической библиотеки Freeglut.lib в свойствах проекта

6. Добавьте в файл main.cpp минимальный код проекта для инициализации, создания окна и запуска библиотеки Freeglut.

#include "GL\freeglut.h"

void DrawGLScene() {
glutSwapBuffers();
}

void GLKeyboard(unsigned char key, int x, int y){
if (key == 27) exit(0);
}

void main(int argcp, char **argv) {
glutInit(&argcp, argv);
glutInitWindowSize(640, 480);
glutInitWindowPosition(0, 0);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

glutCreateWindow("GLUT Application");

glutDisplayFunc(DrawGLScene);
glutKeyboardFunc(GLKeyboard);
glutMainLoop();

7. Соберите и запустите проект. Для этого выберите пункт меню "Отладка" - "Начать отладку" или нажмите клавишу F5 на клавиатуре или значок "Зеленый треугольник" на панели инструментов. 

8. Если в момент запуска проекта выдается сообщение об ошибке, что динамическая библиотека freeglut.dll не найдена, то скопируйте файл freeglut.dll в каталог где у вас находится собранный исполняемый файл вашего проекта, например d:\Projects\vsprojects\freeglut\freeglut_p1\Debug\freeglut_p1.exe (Смотрите сообщение об ошибке рисунок 9).

Рисунок 9. Сообщение об ошибке, что файл freeglut.dll не найден

9. На рисунке 10 показан результат запуска нашего проекта на основе библиотеки Freeglut. 

 Рисунок 10. Результат работы программы

воскресенье, 4 августа 2013 г.

Lazarus World. Создание окна при помощи библиотеки GLUT. Куб на OpenGL


Внимание! Данный пример основан на следующих статьях и примерах из сети Интернет:

1) Статья с сайта LinuxFocus.org — Программирование GLUT: окна и анимация, автор Miguel Angel Sepulveda.
2) Пример куба с сайта с примерами по OpenGL.
3) И статья в wiki на сайте freepascal.org - OpenGL Tutorial

Ну и конечно же, для создания проекта использовалась среда Lazarus 1.0.8 и дистрибутив Fedora 19 Linux.


В данном посте, на примере, показывается использование OpenGL в Lazarus.

Для начала нам необходимо инициализировать OpenGL. Создадим новый проект Lazarus. Выбираем пункт меню File > New, откроется окно выбора нового шаблона. Нам нужен шаблон, который находится в разделе Project > Program и нажимаем кнопку Ok, чтобы подтвердить выбор (Смотрите рисунок 1).

Рисунок 1. Окно выбора нового шаблона проекта


Сохраним проект под именем ogl_p1.lpr. Выбираем пункт меню File > Save As и сохраняем в домашнюю директорию пользователя, в каталог по следующему пути ~/Projects/lazarus/ogl_p1/, где ~ (знак тильда) это домашний каталог пользователя.

Теперь в редакторе исходного кода убираем весь код кроме следующего:

program ogl_p1;

begin

end.

Добавим в наш исходный код секцию uses, в которой мы перечислим модули необходимые нам для работы с OpenGL. Первый модуль который мы должны добавить называется gl, это основной модуль OpenGL. Второй модуль называется glut, этот модуль позволяет создавать OpenGL окно. Таким образом, у нас вышла строчка:

uses gl, glut;

Ниже секции uses, определим переменные, константы и процедуры необходимые нам для создания проекта.

Секция var:

var
Cmd: array of PChar;
CmdCount: Integer;
ScreenWidth, ScreenHeight: Integer;

Здесь можно видеть переменную Cmd для хранения имен параметров командной строки, переменную CmdCount для хранения количества параметров командной строки, и две переменные ScreenWidth, ScreenHeight для хранения размеров экрана по ширине и высоте, соответственно.

Секция const:

const
AppWidth = 400;
AppHeight = 400;
Константы AppWidth и AppHeight содержат размер окна OpenGL.

Процедура DrawGLScene:

Данная процедура будет вызвана при рисование сцены в окне OpenGL. В данной процедуре мы очистим цветовой буфер и буфер глубины. Далее мы создаем шесть четырехсторонних полигона, каждый полигон состоит из четырех вершин. И после того как сцена нарисована мы переключаем буфер для её отображения.

procedure DrawGLScene; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);
glNormal3f( 0.0, 0.0, 1.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5,-0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);

glNormal3f( 0.0, 0.0,-1.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5, 0.5,-0.5);
glVertex3f( 0.5, 0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);

glNormal3f( 0.0, 1.0, 0.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5, 0.5,-0.5);
glVertex3f(-0.5, 0.5,-0.5); glVertex3f(-0.5, 0.5, 0.5);

glNormal3f( 0.0,-1.0, 0.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);
glVertex3f( 0.5,-0.5, 0.5); glVertex3f(-0.5,-0.5, 0.5);

glNormal3f( 1.0, 0.0, 0.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);
glVertex3f( 0.5,-0.5,-0.5); glVertex3f( 0.5, 0.5,-0.5);

glNormal3f(-1.0, 0.0, 0.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5,-0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5,-0.5);
glEnd();

glutSwapBuffers;
end;

Процедура ReSizeGLScene:

Данная процедура вызывается каждый раз когда изменяются размеры окна. В данной процедуре мы перестраиваем сцену под измененный размер окна.

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
glViewport(0, 0, Width, Height);
end;

Процедура GLKeyboard:

Вызывается каждый раз при нажатие на любую клавишу клавиатуры. В данном случае проверяется нажата ли клавиша Esc, код которой 27, если нажата, то программа завершает свою работу.

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
if Key = 27 then
Halt(0);
end;

Процедура InitializeGL:
В данном проекте используется для начальной инициализации сцены OpenGL. В данном случае здесь устанавливается точка обзора сцены, подключается световой источник.

procedure InitializeGL;
begin
glMatrixMode(GL_PROJECTION);
glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);

glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0, 0.0, -2.0);

glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(30.0, 0.0, 1.0, 0.0);

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
end;

Теперь перейдем к описанию кода внутри главных операторных скобок.

Сначала мы присвоим переменной CmdCount значение 1, оно говорит о том что программа будет иметь один параметр командной строки. Далее мы устанавливаем длину массива Cmd на хранения одной строки SetLength(Cmd, CmdCount), это строка является параметром, который содержит имя программы. Заносим в массив Cmd единственный параметр имя программы Cmd[CmdCount-1] := Pchar(ParamStr(CmdCount-1)):

CmdCount := 1;
SetLength(Cmd, CmdCount);
Cmd[CmdCount-1] := PChar(ParamStr(CmdCount-1));

Проведем инициализацию GLUT.

glutInit(@CmdCount, @Cmd);

Выбор режима, двойной буфер, RGB палитра и буфер глубины

glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);

Задаем размер окна OpenGL и позицию окна на экране.
glutInitWindowSize(AppWidth, AppHeight);

ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,
(ScreenHeight - AppHeight) div 2);

Создаем окно с заголовком ogl_p1:

glutCreateWindow('ogl_p1');

Инициализация сцены:

InitializeGL;

Регистрация вызываемых процедур:
glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

Запуск механизма обработки событий:
glutMainLoop;

На рисунке 2 показан результат работы программы.

Рисунок 2. Результат запуска приложения


Ниже показан весь код проекта:

program ogl_p1;

uses gl, glut;

var
  Cmd: array of PChar;
  CmdCount: Integer;
  ScreenWidth, ScreenHeight: Integer;

const
  AppWidth = 400;
  AppHeight = 400;

procedure DrawGLScene; cdecl;
begin
     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

     glBegin(GL_QUADS);
     glNormal3f( 0.0, 0.0, 1.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5);
     glVertex3f(-0.5,-0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);

     glNormal3f( 0.0, 0.0,-1.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5, 0.5,-0.5);
     glVertex3f( 0.5, 0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);

     glNormal3f( 0.0, 1.0, 0.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5, 0.5,-0.5);
     glVertex3f(-0.5, 0.5,-0.5); glVertex3f(-0.5, 0.5, 0.5);

     glNormal3f( 0.0,-1.0, 0.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);
     glVertex3f( 0.5,-0.5, 0.5); glVertex3f(-0.5,-0.5, 0.5);

     glNormal3f( 1.0, 0.0, 0.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);
     glVertex3f( 0.5,-0.5,-0.5); glVertex3f( 0.5, 0.5,-0.5);

     glNormal3f(-1.0, 0.0, 0.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5,-0.5, 0.5);
     glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5,-0.5);
     glEnd();

     glutSwapBuffers;
end;

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
  glViewport(0, 0, Width, Height);
end;

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
  if Key = 27 then
    Halt(0);
end;

procedure InitializeGL;
begin
  glMatrixMode(GL_PROJECTION);
  glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);

  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0.0, 0.0, -2.0);

  glRotatef(30.0, 1.0, 0.0, 0.0);
  glRotatef(30.0, 0.0, 1.0, 0.0);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
end;

begin

CmdCount := 1;
SetLength(Cmd, CmdCount);
Cmd[CmdCount-1] := PChar(ParamStr(CmdCount-1));

glutInit(@CmdCount, @Cmd); 
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH); 
 
glutInitWindowSize(AppWidth, AppHeight);

ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,
   (ScreenHeight - AppHeight) div 2);

glutCreateWindow('ogl_p1');

InitializeGL;

glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

glutMainLoop;

end.



syntax highlighted by Code2HTML, v. 0.9.1