Pastafarianist

Basic OpenGL Drawing

Jul 24th, 2012
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.08 KB | None | 0 0
  1. {$apptype GUI}
  2.  
  3. uses Gl, Glu, Glut; // GLU нам пока не нужен
  4.  
  5. const width = 600; // размеры окна
  6.       height = 600;
  7.  
  8. procedure display(); cdecl; // cdecl обязателен
  9. begin
  10.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистить экран и Z-буфер
  11.   glLoadIdentity(); // сбросить матрицу рисования
  12.  
  13.   // красный треугольник
  14.   glColor3f(1.0, 0.0, 0.0);
  15.   glBegin(GL_TRIANGLES); // режим рисования треугольников по 3-м точкам
  16.     glVertex3f(-1.5, 1.8, 0.0);
  17.     glVertex3f(-1.8, 1.2, 0.0);
  18.     glVertex3f(-1.2, 1.2, 0.0);
  19.   glEnd();
  20.  
  21.   // зелёные линии
  22.   glColor3f(0.0, 1.0, 0.0);
  23.   glBegin(GL_LINE_STRIP); // режим рисования ломаной
  24.     glVertex3f(-0.7, 1.8, 0.0);
  25.     glVertex3f(-1.0, 1.2, 0.0);
  26.     glVertex3f(-0.4, 1.2, 0.0);
  27.   glEnd();
  28.  
  29.   // большой разноцветный треугольник справа
  30.   glLoadIdentity();
  31.   glTranslatef(0.9, 0.0, 0.0); // Переместить центр координат на вектор (0.9, 0, 0)
  32.   glBegin(GL_TRIANGLES);
  33.     glColor3f(1.0, 0.0, 0.0);  
  34.      glVertex3f(0.0, 1.0, 0.0);
  35.     glColor3f(0.0, 1.0, 0.0);
  36.      glVertex3f(-1.0, -1.0, 0.0);
  37.     glColor3f(0.0, 0.0, 1.0);
  38.      glVertex3f(1.0, -1.0, 0.0);
  39.   glEnd();
  40.  
  41.   // маленький разноцветный повёрнутый треугольник посередине
  42.   glLoadIdentity();
  43.   // Повернуть центр координат на 45 градусов относительно вектора (0, 0, 1)
  44.   glRotatef(45.0, 0.0, 0.0, 1.0);
  45.   glBegin(GL_TRIANGLES);
  46.     glColor3f(1.0, 0.0, 0.0);  
  47.      glVertex3f(0.0, 0.5, 0.0);
  48.     glColor3f(0.0, 1.0, 0.0);
  49.      glVertex3f(-0.5, -0.5, 0.0);
  50.     glColor3f(0.0, 0.0, 1.0);
  51.      glVertex3f(0.5, -0.5, 0.0);
  52.   glEnd();
  53.  
  54.   glFlush(); // вывести всё на экран
  55. end;
  56.  
  57. procedure keyboard(code: byte; x, y: longint); cdecl; // cdecl обязателен
  58. // аргументы - код нажатой клавиши и положение курсора в момент нажатия
  59. begin
  60.   case code of
  61.     27: halt; // код клавиши Esc
  62.   end;
  63. end;
  64.  
  65. procedure initGl;
  66. begin
  67.   // Установить цвет для очистки экрана
  68.   // Используется в glClear
  69.   glClearColor(0.0, 0.0, 0.0, 0.0); // чёрный
  70.  
  71.   // Настроить проекцию
  72.   glMatrixMode(GL_PROJECTION); // Перейти в режим редактирования проекции
  73.   glLoadIdentity(); // Сбросить матрицу проекции на id
  74.   glOrtho(-2, 2, -2*height/width, 2*height/width, -2, 2); // ортогональная проекция
  75.   // Будет видно всё в параллелепипеде x=-2..2, y=-2*h/w..2*h/w, z=-2..2
  76.  
  77.   glMatrixMode(GL_MODELVIEW); // Вернуться в редактирование матрицы рисования
  78.   glLoadIdentity(); // Сбросить матрицу рисования на id
  79.  
  80.   glClearDepth(1.0); // Забить Z-буфер единицами
  81.   glEnable(GL_DEPTH_TEST); // Включить проверку Z-буфера
  82.   glDepthFunc(GL_LEQUAL); // Установить функцию сравнения с Z-буфером на <=
  83. end;
  84.  
  85. procedure initGlut;
  86. begin
  87.   glutInitDisplayMode(GLUT_SINGLE or GLUT_RGB); // магия
  88.   glutInitWindowSize(width, height); // Установить размер окна
  89.   glutCreateWindow('example'); // Создать окно с таким заголовком
  90.   glutDisplayFunc(@display); // Установить функцию отрисовки окна
  91.   glutKeyboardFunc(@keyboard); // Установить функцию обработки клавиатуры
  92. end;
  93.  
  94. begin
  95.   initGlut; // Инициализация библиотеки GLUT, см. выше
  96.   initGl; // Основная инициализация OpenGL, см. выше
  97.   glutMainLoop(); // Запустить главный цикл обработки событий
  98. end.
Add Comment
Please, Sign In to add comment