OpenGL/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: OpenGL/ru
| Old | New | Line | |
|---|---|---|---|
| 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).* |
