Sign in Join
Wiki copytemporary

OpenGL/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: OpenGL/ru

OldNewLine
1+OpenGL (**Open** **G**raphics **L**ibrary) - это кроссплатформенный API для создания трехмерной компьютерной графики. Большинство современных видеокарт обеспечивают аппаратную поддержку OpenGL, что делает OpenGL хорошим решением для написания передового графического программного обеспечения.
2+
3+## Модули OpenGL во Free Pascal
4+
5+Интерфейс FreePascal OpenGL состоит из следующих модулей:
6+
7+- **gl**: Этот модуль содержит основные функции, такие как рисование полигонов, применение преобразований, установка цветов и материалов, ... Процедуры всегда начинаются с предлога "gl".
8+- **glu**: Этот модульк содержит утилиты OpenGL. Хотя в нем есть некоторые полезные функции, этот модуль не является необходимым, поскольку вы можете реализовать все процедуры glu с функциональностью блока gl. Процедуры всегда начинаются с предлога "glu".
9+- **glext**: Производители могут предоставлять дополнительные функциональные возможности через расширения. Используйте этот модуль для использования этих расширений.
10+ Функциональность, характерная для более новых версий OpenGL (1.2 и выше), также доступна в этом модуле. Инициализация этой функциональности аналогична инициализации обычных расширений OpenGL: просто вызовите функцию Load_GL_version_X_Y. Если версия вашей библиотеки OpenGL старее X.Y, Load_GL_version_X_Y вернет false.
11+- **glut**: Этот модуль обеспечивает функциональность для создания окна OpenGL. Хотя это кроссплатформенный модуль, большинство операционных систем Windows по умолчанию не имеют glut DLL.
12+- **glx**: glx предоставляет функциональность для настройки окна OpenGL в системе X Window. Процедуры всегда начинаются с предлога "glx". Очевидно, что вы не можете использовать это устройство в не-X Window системах, таких как Windows.
13+
14+## Модули OpenGL в Lazarus
15+
16+Lazarus включает в себя TOpenGLControl - элемент управления LCL с контекстом OpenGL. Пакет Lazarus LazOpenGLContext находится в каталоге lazarus/components/opengl/lazopenglcontext.lpk. Пример можно найти в lazarus/examples/openglcontrol/openglcontrol_demo.lpi.
17+
18+Если вы хотите изменить реализацию TOpenGLControl, например, чтобы добавить новые свойства, такие как ColorBits и AuxBuffers, см. [[Extending TOpenGLControl|Расширение TOpenGLControl]].
19+
20+## Сторонние OpenGL модули
21+
22+- [[GLScene/ru|GLScene]] - пакет Lazarus с множеством дополнительных функций для приложений OpenGL.
23+- [[Castle Game Engine]] - позволяет перемещаться и визуализировать трехмерные миры (в VRML, X3D и других трехмерных форматах).
24+
25+## Учебник
26+
27+- [[OpenGL Tutorial/ru|OpenGL Tutorial]]
28+
29+## Учебник OpenGL 3.3 (современный OpnGL )
30+
31+- [Lazarus OpenGL 3.3 - Tutorial](https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial)- (нем.) (внешний ресурс)
32+
33+## Вопросы/ответы по использованию привязок OpenGL
34+
35+**В: Я не понимаю, почему версия ARB не работает. Насколько мне известно, она имеет те же точки входа, что и основные функциональные возможности, и для поддержки функций ARB-версии требуются версии OpenGL, даже если в ядре сейчас не версия ARB.**
36+
37+О:Нет. OpenGL не должен поддерживать точки входа расширения, даже если он уже поддерживает те же функции в ядре. Поставщик может свободно удалять расширения и поддерживать только «основные» функции.
38+
39+Кроме того, иногда, когда функциональность продвигается из расширения ARB в ядро, оно немного изменяется (хотя в 99% случаев оно остается прежним). Примером являются шейдеры GLSL, которые предоставляют (очень немного) различные API через расширения ARB и спецификацию ядра 2.0.
40+
41+По сути, то, что раскрывается через расширения, полностью перпендикулярно тому, что раскрывается через основные функции, поэтому их следует инициализировать отдельно. В особых случаях вы можете делать такие трюки, как
42+
43+``` pascal
44+if glIsBufferARB = nil then glIsBufferARB := @glIsBuffer;
45+```
46+
47+но это следует оставить конечному программисту, который знает, что поведение «ARB_vertex_buffer_object» идентично тому, как оно работает в ядре.
48+
49+**В: Когда я пытаюсь использовать функцию gluTessCallback из модуля glu, либо компилятор жалуется, либо я получаю ошибку сегментации, когда пытаюсь запустить свою программу. Как я могу заставить это работать должным образом?**
50+
51+О: Функция gluTessCallback определяется следующим образом в модуле **glu**:
52+
53+``` pascal
54+{$IFDEF Windows}
55+ {$DEFINE extdecl := stdcall}
56+{$ELSE}
57+ {$DEFINE extdecl := cdecl}
58+{$ENDIF}
59+
60+gluTessCallback: procedure(tess: PGLUtesselator; which: GLenum; fn: TCallBack); extdecl;
61+```
62+
63+<b>Примечание для Windows:</b> Общая проблема заключается в том, что соглашение о вызовах функций glu, по-видимому, варьируется в нескольких разных сборках DLL GLUT для Windows. В некоторых это stdcall, в некоторых cdecl. Наиболее часто используемым является stdcall.
64+
65+Вы должны определить свои функции обратного вызова следующим образом:
66+
67+``` pascal
68+procedure MyTessBegin(which: GLEnum);
69+{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
70+begin
71+ glBegin(which);
72+end;
73+
74+procedure MyTessEnd;
75+{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
76+begin
77+ glEnd(); // Требуется пустые ()
78+end;
79+
80+procedure MyTessVertex(data: Pointer);
81+{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
82+begin
83+ glVertex3dv(PGLDouble(data));
84+end;
85+```
86+
87+Обратите внимание на модификаторы cdecl/stdcall; они необходимы. Затем вы вызываете gluTessCallback следующим образом:
88+
89+``` pascal
90+gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(@MyTessBegin));
91+gluTessCallback(tess, GLU_TESS_END, TCallBack(@MyTessEnd));
92+gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(@MyTessVertex));
93+```
94+
95+Убедитесь, что указатель на функцию обратного вызова приведен к типу TCallBack, как показано выше.
96+
97+В качестве альтернативы, если вы хотите напрямую обратиться к функциям OpenGL, используйте следующее соглашение о вызовах:
98+
99+``` pascal
100+gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(glBegin));
101+gluTessCallback(tess, GLU_TESS_END, TCallBack(glEnd));
102+gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(glVertex3dv));
103+```
104+
105+---
106+*From the Free Pascal wiki, page "OpenGL/ru", as it stood on 2020-03-29 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history