Sign in Join
Wiki copytemporary

OpenGL/ru: what changed

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

OldNewLine
11OpenGL (**Open** **G**raphics **L**ibrary) - это кроссплатформенный API для создания трехмерной компьютерной графики. Большинство современных видеокарт обеспечивают аппаратную поддержку OpenGL, что делает OpenGL хорошим решением для написания передового графического программного обеспечения.
22
33## Модули OpenGL во Free Pascal
44
55Интерфейс FreePascal OpenGL состоит из следующих модулей:
66
77- **gl**: Этот модуль содержит основные функции, такие как рисование полигонов, применение преобразований, установка цветов и материалов, ... Процедуры всегда начинаются с предлога "gl".
88- **glu**: Этот модульк содержит утилиты OpenGL. Хотя в нем есть некоторые полезные функции, этот модуль не является необходимым, поскольку вы можете реализовать все процедуры glu с функциональностью блока gl. Процедуры всегда начинаются с предлога "glu".
99- **glext**: Производители могут предоставлять дополнительные функциональные возможности через расширения. Используйте этот модуль для использования этих расширений.
1010 Функциональность, характерная для более новых версий OpenGL (1.2 и выше), также доступна в этом модуле. Инициализация этой функциональности аналогична инициализации обычных расширений OpenGL: просто вызовите функцию Load_GL_version_X_Y. Если версия вашей библиотеки OpenGL старее X.Y, Load_GL_version_X_Y вернет false.
1111- **glut**: Этот модуль обеспечивает функциональность для создания окна OpenGL. Хотя это кроссплатформенный модуль, большинство операционных систем Windows по умолчанию не имеют glut DLL.
1212- **glx**: glx предоставляет функциональность для настройки окна OpenGL в системе X Window. Процедуры всегда начинаются с предлога "glx". Очевидно, что вы не можете использовать это устройство в не-X Window системах, таких как Windows.
1313
1414## Модули OpenGL в Lazarus
1515
1616Lazarus включает в себя TOpenGLControl - элемент управления LCL с контекстом OpenGL. Пакет Lazarus LazOpenGLContext находится в каталоге lazarus/components/opengl/lazopenglcontext.lpk. Пример можно найти в lazarus/examples/openglcontrol/openglcontrol_demo.lpi.
1717
1818Если вы хотите изменить реализацию TOpenGLControl, например, чтобы добавить новые свойства, такие как ColorBits и AuxBuffers, см. [[Extending TOpenGLControl|Расширение TOpenGLControl]].
1919
2020## Сторонние OpenGL модули
2121
2222- [[GLScene/ru|GLScene]] - пакет Lazarus с множеством дополнительных функций для приложений OpenGL.
2323- [[Castle Game Engine]] - позволяет перемещаться и визуализировать трехмерные миры (в VRML, X3D и других трехмерных форматах).
2424
2525## Учебник
2626
2727- [[OpenGL Tutorial/ru|OpenGL Tutorial]]
2828
2929## Учебник OpenGL 3.3 (современный OpnGL )
3030
3131- [Lazarus OpenGL 3.3 - Tutorial](https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial)- (нем.) (внешний ресурс)
3232
3333## Вопросы/ответы по использованию привязок OpenGL
3434
3535**В: Я не понимаю, почему версия ARB не работает. Насколько мне известно, она имеет те же точки входа, что и основные функциональные возможности, и для поддержки функций ARB-версии требуются версии OpenGL, даже если в ядре сейчас не версия ARB.**
3636
3737О:Нет. OpenGL не должен поддерживать точки входа расширения, даже если он уже поддерживает те же функции в ядре. Поставщик может свободно удалять расширения и поддерживать только «основные» функции.
3838
3939Кроме того, иногда, когда функциональность продвигается из расширения ARB в ядро, оно немного изменяется (хотя в 99% случаев оно остается прежним). Примером являются шейдеры GLSL, которые предоставляют (очень немного) различные API через расширения ARB и спецификацию ядра 2.0.
4040
4141По сути, то, что раскрывается через расширения, полностью перпендикулярно тому, что раскрывается через основные функции, поэтому их следует инициализировать отдельно. В особых случаях вы можете делать такие трюки, как
4242
4343``` pascal
4444if glIsBufferARB = nil then glIsBufferARB := @glIsBuffer;
4545```
4646
4747но это следует оставить конечному программисту, который знает, что поведение «ARB_vertex_buffer_object» идентично тому, как оно работает в ядре.
4848
4949**В: Когда я пытаюсь использовать функцию gluTessCallback из модуля glu, либо компилятор жалуется, либо я получаю ошибку сегментации, когда пытаюсь запустить свою программу. Как я могу заставить это работать должным образом?**
5050
5151О: Функция gluTessCallback определяется следующим образом в модуле **glu**:
5252
5353``` pascal
5454{$IFDEF Windows}
5555 {$DEFINE extdecl := stdcall}
5656{$ELSE}
5757 {$DEFINE extdecl := cdecl}
5858{$ENDIF}
5959
6060gluTessCallback: procedure(tess: PGLUtesselator; which: GLenum; fn: TCallBack); extdecl;
6161```
6262
63-<b>Примечание для Windows:</b> Общая проблема заключается в том, что соглашение о вызовах функций glu, по-видимому, варьируется в нескольких разных сборках DLL GLUT для Windows. В некоторых это stdcall, в некоторых cdecl. Наиболее часто используемым является stdcall.
63+Примечание для Windows: Общая проблема заключается в том, что соглашение о вызовах функций glu, по-видимому, варьируется в нескольких разных сборках DLL GLUT для Windows. В некоторых это stdcall, в некоторых cdecl. Наиболее часто используемым является stdcall.
6464
6565Вы должны определить свои функции обратного вызова следующим образом:
6666
6767``` pascal
6868procedure MyTessBegin(which: GLEnum);
6969{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
7070begin
7171 glBegin(which);
7272end;
7373
7474procedure MyTessEnd;
7575{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
7676begin
7777 glEnd(); // Требуется пустые ()
7878end;
7979
8080procedure MyTessVertex(data: Pointer);
8181{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
8282begin
8383 glVertex3dv(PGLDouble(data));
8484end;
8585```
8686
8787Обратите внимание на модификаторы cdecl/stdcall; они необходимы. Затем вы вызываете gluTessCallback следующим образом:
8888
8989``` pascal
9090gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(@MyTessBegin));
9191gluTessCallback(tess, GLU_TESS_END, TCallBack(@MyTessEnd));
9292gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(@MyTessVertex));
9393```
9494
9595Убедитесь, что указатель на функцию обратного вызова приведен к типу TCallBack, как показано выше.
9696
9797В качестве альтернативы, если вы хотите напрямую обратиться к функциям OpenGL, используйте следующее соглашение о вызовах:
9898
9999``` pascal
100100gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(glBegin));
101101gluTessCallback(tess, GLU_TESS_END, TCallBack(glEnd));
102102gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(glVertex3dv));
103103```
104104
105105---
106106*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