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