-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
180 lines (144 loc) · 12.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<!DOCTYPE html>
<html>
<head>
<title>Уроки по OpenGL</title>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="stylesheet" href="highlight/styles/default.css">
<script src="highlight/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="script.js"></script>
</head>
<body>
<div id="side-bar" class="noselect">
<span>Урок 01: Установка GLUT и создание окна</span>
<div id="toggler"><i class="fa fa-chevron-left"></i></div>
</div>
<div id="content">
<div class="main-text">
<h2>Установка GLUT под Borland C++ Builder 6</h2><p class="warn">
<a href="glut for borland.rar"><i class="fa fa-download"></i>Скачать библиотеку GLUT</a></p>
<p>Из архива файлы следует положить в следующем порядке: <b>glut32.dll</b> в <b>WindowsRoot\system32</b>, <b>glut.h</b> в <b>$(BCB)\include\gl</b> и <b>glut32.lib</b> в <b>$(BCB)\lib</b>.
В опциях проекта (<b>Project-Options-Directories/Conditionals</b>), использующего <b>GLUT</b>, в <b>Library path</b> должна быть указана папка <b>$(BCB)\lib</b> и <b>$(BCB)\lib\Psdk</b>(в некоторых случаях), а в <b>Include path</b> – папка <b>$(BCB)\include</b>. В поле <b>Conditional defines</b> добавить <b>;GLUT_BUILDING_LIB</b><br>
Если появляются ошибки, попробуйте добавить в код <b>#pragma comment (lib, "glut32.lib")</b>.</p>
<p class="warn"><i class="fa fa-exclamation-triangle"></i>Внимание: при каждом новом проекте повторять изменение его свойств.</p>
<h2>Урок 01 - Создание окна</h2>
<p>Необходимые знания - геометрия пространства, базовые понятия графических примитивов - точка, ребро, пиксель, плоскость, полигон или фейс и т.д. и т.п. <b>OpenGL</b> является основным 3D набором инструментов разработчика, который пишет продвинутые графические приложения для работы с 3D графикой, разрабатывает игры под <b>MacOS</b> или <b>Linux</b> (напомню, что под <b>Windows</b> есть свой <b>API</b> - <b>DirectX</b>, тоже богатый на возможности, но поддержка <b>OpenGL </b>в ней также реализована).<br>
В этом разделе мы собираемся создать функцию <b>main</b> нашей программы. Функция <b>main</b> будет состоять из необходимой инициализации и цикл обработки событий.
Первый блок функции <b>main</b> будет инициализировать процедуры <b>GLUT</b> и создаст окно.
После <b>GLUT</b> входит в цикл обработки событий, получив контроль над приложением. <b>GLUT</b> будет ждать каждое следующее событие, проверяя, есть ли функция для его обработки.
Поэтому, прежде чем <b>GLUT</b> вступит в цикл обработки событий мы должны инициализировать те функции <b>GLUT</b>, которые мы хотим вызвать для обработки вызываемых событий.
Каждый раз для вызова функции <b>GLUT</b>, её (функцию) - нужно зарегистрировать.</p>
<p>
Создаём консольное приложение с помощью <b>File->New->Other->Console Wizard</b><br><br>
<img src="images/lesson01/bcb_new_items.png">
<span class="img-desc">File->New->Other</span><br>
<img src="images/lesson01/bcb_console_wiz.png">
<span class="img-desc">Настройка консольного приложения</span><br>
<img src="images/lesson01/bcb_project_options.png">
<span class="img-desc">Настройки проекта</span><br>
</p>
<b>Скелет функции main.</b>
<p><pre><code class="cpp">
int main(int argc, char **argv)
{
// инициализация GLUT and создание окна
// регистрация вызовов функций GLUT
// цикл обработки событий
}
</code></pre></p>
<h2>Инициализация GLUT и создание окна</h2>
<p>Все функции инициализации в <b>glut</b> начинаются с <b>glutInit</b>. Первое, что вы должны сделать, это вызвать функцию glutInit.</p>
<p><pre><code class="cpp">void glutInit(int *argc, char **argv);</code></pre></p>
<p><b>Параметры:</b><br>
* int argc - количество аргументов<br>
* char** argv - их описание в виде указателя на строку</p>
После инициализации <b>GLUT</b>, мы собираемся инициализировать окно приложения. Сначала установим положение окна, вернее его верхний левый угол. Для этого мы используем функцию <b>glutInitWindowPosition</b>.<br>
<p><pre><code class="cpp">void glutInitWindowPosition(int x, int y);</code></pre></p>
<p><b>Параметры:</b><br>
х - число пикселей от левой части экрана.<br>
у - количество пикселей от верхней части экрана.<br></p>
<p>Далее мы выбираем размер окна. Для этого мы используем функцию <b>glutInitWindowSize</b>.</p>
<pre><code class="cpp">void glutInitWindowSize(int width, int height);</code></pre>
<p><b>Параметры:</b><br>
width - ширина окна;<br>
height - высота окна;<br></p>
<p>Затем вы должны определить режим отображения с помощью функции <b>glutInitDisplayMode</b>.</p>
<pre><code class="cpp">void glutInitDisplayMode(unsigned int mode);</code></pre>
<p><b>Параметры:</b><br>
<b>mode</b> - определяет режим отображения;<br>
Вы можете использовать режим , чтобы определить цвет, а также количество и тип буферов.<br>
Предопределенные константы для определения цвета модели являются:<br>
<b>GLUT_RGBA</b> или <b>GLUT_RGB</b> - выбирает окно RGBA.<br>
<b>GLUT_INDEX</b> - выбирает режим индексированного цвета.<br>
Режим отображения также позволяет выбрать одно-или двухместные окна буфера. Предопределенные константы для этого являются:<br>
<b>GLUT_SINGLE</b> - режим одинарной буферизации.<br>
<b>GLUT_DOUBLE</b> - режим двойной буферизации, - РЕЖИМ, ПОДХОДЯЩИЙ ДЛЯ АНИМАЦИИ.<br>
Также существуют специализированные режимы буфера:<br>
<b>GLUT_ACCUM</b> - буфер накопления.<br>
<b>GLUT_STENCIL</b> - буфер трафарета.<br>
<b>GLUT_DEPTH</b> -буфер глубины.<br>
Итак, предположим, вы хотите создать окно в цветовом пространстве RGB , с двойной буферизацией, с использованием буфера глубины. Все, что вам нужно сделать, это прописать соответствующие константы для того, чтобы создать необходимый режим.</p>
<pre><code class="cpp">glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);</code></pre>
<p>После этих шагов, окно может быть создано с помощью <b>glutCreateWindow</b>.<br>
<pre><code class="cpp">int glutCreateWindow(char *title);</code></pre>
<b>Параметры:</b><br>
title - имя создаваемого окна;<br>
Итоговый код:<br>
<pre><code class="cpp">#include <gl/glut.h> //подключаем заголовочный файл glut.h
#pragma comment (lib, "glut32.lib")
int main(int argc, char **argv) {
// Инициализация GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Урок 1");
return 1;<br>
}</code></pre>
</p>
<h2>Функции рисования и регистрации обратных вызовов</h2>
<p>Если вы запустите этот код свыше, вы получите пустое черное окно консоли, без окна OpenGL. Есть две вещи, которые нужно сделать прежде всего. Во-первых, указать <b>GLUT</b>, какие функции отвечают за визуализацию. Давайте создадим пример функции для рисования. Функции представлены ниже очищают буфер цвета и рисуют треугольник.
<br><pre><code class="cpp">void renderScene(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_TRIANGLES)
glVertex3f(-0.5,-0.5,0.0)
glVertex3f(0.0,0.5,0.0)
glVertex3f(0.5,-0.5,0.0)
glEnd()
}<br></code></pre>
Название этой функции задаётся программистом. Однако теперь вы должны сказать <b>GLUT</b> что он должен использовать функции, которую мы только что написали для рисования. Это называется регистрации обратного вызова. <b>GLUT</b> будет вызывать функцию всякий раз, когда вы выберете её для рендеринга( отрисовнки ).
Так что давайте говорить <b>GLUT</b>, что функция <b>renderScene</b> должны использоваться всякий раз, когда окно требуется окрасить. <b>GLUT</b> имеет функцию, которая принимает в качестве параметра имя функции для использования при необходимости перерисовки.</p>
<p><pre><code class="cpp">void glutDisplayFunc(void (*funcName)(void));</code></pre>
Пропись главного цикла программы. Бесконечный цикл, отрабатывающий все функции событий, зарегестрированные программистом.<br>
<pre><code class="cpp">void glutMainLoop(void);//главный цикл</code></pre>
Итоговый текст программы выглядит вот так:<br>
<pre><code class="cpp"> #include <gl/glut.h>
#pragma comment (lib, "glut32.lib")
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,0.5,0.0);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0,0.0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char **argv) {
// инициализация
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Lesson 01");
// регистрация обратных вызовов
glutDisplayFunc(renderScene);
// Основной цикл GLUT
glutMainLoop();
return 1;
}</code></pre>
</p> </div>
</div>
</body>
</html>