Ooogles — это ультратонкая объектно-ориентированная оболочка Delphi вокруг OpenGL-ES 2.0, практически не влияющая на производительность. Его также можно использовать для создания приложений OpenGL для настольных платформ с использованием подмножества OpenGL-ES OpenGL.
Эта оболочка все еще находится на довольно низком уровне. Это не «движок рендеринга» или платформа высокого уровня, поэтому вам все равно понадобятся знания OpenGL.
Основные цели Ooogles — сделать использование OpenGL-ES проще и менее подверженным ошибкам, предлагая отчеты об ошибках в сборках DEBUG
и улучшая возможности Code Insight в Delphi IDE.
Ooogles имеет следующие особенности:
TGLTexture
и TGLShader
, предотвращая подобные ошибки.GL_INVALID_ENUM
. Вместо этого эта оболочка использует настоящие перечисления Delphi, предотвращая большинство этих ошибок.DEBUG
эти ошибки будут выявляться посредством исключений, а также будут записываться любые предупреждения на консоль отладки.gl
(который больше похож на пространство имен). Например, OpenGL API glClear
заключен в метод gl.Clear
.DEBUG
и включенными утверждениями (конфигурация по умолчанию для отладочных сборок) каждый вызов OpenGL проверяется на наличие ошибок, и при возникновении ошибки возникает исключение с указанием типа ошибки и метода, в котором она произошла. Если DEBUG
не определен или утверждения отключены, весь код проверки ошибок удаляется из сборки, поэтому он не оказывает никакого влияния на производительность.DEBUG
с включенными утверждениями в консоль отладки будут записываться предупреждения, если вы забудете привязать объект перед его использованием (или если в данный момент привязан объект, отличный от того, который вы используете).ExamplesCommon
. Оболочка не предоставляет функции более высокого уровня, такие как автоматическое управление ресурсами OpenGL. Вам необходимо самостоятельно освободить ресурсы OpenGL, когда они вам больше не нужны. Ресурсы обычно создаются с помощью метода New
и освобождаются с помощью метода Delete
. Например:
var
Texture: TGLTexture;
begin
Texture.New;
// Do something with texture
Texture.Delete;
end ;
Я могу добавить автоматическое управление ресурсами в будущем, если и когда Delphi получит поддержку финализаторов записей.
Кроме того, оболочка поддерживает только OpenGL-ES версии 2.0. Он не поддерживает «старый» конвейер рендеринга с фиксированными функциями версии 1. Я могу добавить поддержку версии 3.0 и выше, как только Delphi станет более распространенной.
Эта оболочка не имеет никаких зависимостей, кроме требования библиотеки FastMath. Эта библиотека предлагает (помимо прочего) очень быстрые векторные и матричные математические вычисления, что делает ее идеальной для использования в высокопроизводительных (OpenGL) приложениях.
Чтобы начать:
FM_COLUMN_MAJOR
в свой проект (для всех конфигураций — все платформы). Это обеспечивает хранение матриц по столбцам, что имеет больше смысла для приложений OpenGL.InitOoogles
. Это необходимо для эмуляции OpenGL-ES на платформах OpenGL. Если ваше приложение использует несколько контекстов, вы должны вызвать InitOoogles один раз для каждого контекста (после того, как сделаете его текущим). Взгляните на модули Sample.Platform.*
, чтобы узнать, когда это вызывать.Winapi.OpenGL
, iOSapi.OpenGLES
и т. д.). Чтобы упростить использование правильных модулей OpenGL, проще всего вместо этого включить файл OpenGL.inc в разделы использования, например: uses
{ $INCLUDE 'OpenGL.inc' }
Neslib.Ooogles;
Просто убедитесь, что вы «используете» хотя бы еще один модуль после включаемого файла.
Ниже приведен список основных классов (на самом деле записей), используемых в Ooogles, а также ссылки на их документацию:
attribute
в вершинном шейдере.uniform
в вершинном или фрагментном шейдере.Если вы свободно владеете OpenGL, следующая таблица может оказаться полезной для перевода с API OpenGL на метод Ooogles. Все должно быть довольно просто.
OpenGL | Оооглс |
---|---|
glActiveTexture | TGLTexture.BindToTextureUnit |
glAttachShader | TGLProgram.AttachShader |
глбиндаттриблокация | TGLVertexAttrib.Bind |
glBindBuffer | TGLBuffer.Bind |
glBindFramebuffer | TGLFramebuffer.Bind |
glBindTexture | TGLTexture.Bind |
glBlendColor | gl.BlendColor |
glBlendEquation | gl.BlendEquation |
glBlendEquationSeparate | gl.BlendEquationSeparate |
glBlendFunc | gl.BlendFunc |
glBlendFuncSeparate | gl.BlendFuncSeparate |
глбуффердата | ТГЛБуффер.Данные |
глбуфферсубдата | TGLBuffer.SubData |
glCheckFramebufferStatus | TGLFramebuffer.Status |
glClear | гл.Очистить |
glClearColor | гл.ClearColor |
glClearDepthf | gl.ClearDepth |
glClearStencil | gl.ClearStencil |
glColorMask | gl.ColorMask |
glCompileShader | TGLShader.Compile |
glCompressedTexImage2D | TGLTexture.UploadCompressed |
glCompressedTexSubImage2D | TGLTexture.SubUploadCompressed |
glCopyTexImage2D | TGLTexture.Copy |
glCopyTexSubImage2D | TGLTexture.SubCopy |
glCreateProgram | TGLProgram.New |
глкреатешейдер | TGLShader.Новый |
glCullFace | гл.CullFace |
glDeleteBuffers | TGLBuffer.Delete |
glDeleteFramebuffers | TGLFramebuffer.Delete |
глделетепрограмма | TGLProgram.Delete |
glDeleteRenderbuffers | TGLRenderbuffer.Delete |
глделетешейдер | TGLShader.Delete |
glDeleteTextures | TGLTexture.Delete |
glDepthFunc | gl.DepthFunc |
glDepthMask | gl.DepthMask |
glDepthRangef | gl.DepthRange |
glDetachShader | TGLProgram.DetachShader |
glDisable | гл.Отключить |
glDisableVertexAttribArray | TGLVertexAttrib.Отключить |
glDrawArrays | гл.DrawArrays |
glDrawElements | gl.DrawElements |
glEnable | гл.Включить |
glEnableVertexAttribArray | TGLVertexAttrib.Enable |
глфиниш | гл.Готово |
глФлеш | гл.Flush |
glFramebufferRenderbuffer | TGLFramebuffer.AttachRenderbuffer |
glFramebufferTexture2D | TGLFramebuffer.AttachTexture |
glFrontFace | гл.FrontFace |
glGenBuffers | TGLBuffer.Новый |
glGenFramebuffers | TGLFramebuffer.Новый |
glGenRenderbuffers | TGLRenderbuffer.Новый |
glGenTextures | TGLTexture.Новый |
glGenerateMipmap | TGLTexture.GenerateMipmap |
glGetBooleanv | различные методы Get* |
glGetFloatv | различные методы Get* |
glGetIntegerv | различные методы Get* |
глжетактивеаттриб | TGLProgram.GetAttributeInfo |
glGetActiveUniform | TGLProgram.GetUniformInfo |
glGetAttachedShaders | TGLProgram.GetAttachedShaders |
glGetAttribLocation | TGLVertexAttrib.Init |
glGetBufferParameteriv | TGLBuffer.Get* |
глжетеррор | гл.GetError |
glGetFramebufferAttachmentParameteriv | TGLFramebuffer.Get* |
glGetProgramInfoLog | TGLProgram (в режиме ОТЛАДКИ) |
glGetProgramiv | TGLProgram.Get* |
glGetRenderbufferParameteriv | TGLRenderbuffer.Get* |
глжетшейдеринфолог | TGLShader (в режиме DEBUG) |
glGetShaderSource | TGLShader.GetSource |
glGetShaderiv | TGLShader.Get* |
глжетстринг | gl.Get* |
glGetTexParameter* | TGLTexture.Get* |
glGetUniform | TGLUniform.GetValue |
glGetUniformLocation | TGLUniform.Init |
glGetVertexAttrib* | TGLVertexAttrib.Get* |
глжетвертексаттрибпоинтерв | TGLVertexAttrib.GetOffset/GetData |
глХинт | TGLTexture.MipmapHint |
glIsBuffer | не нужен |
GLISEnabled | гл.IsEnabled |
glIsFramebuffer | не нужен |
GLISProgram | не нужен |
glIsRenderbuffer | не нужен |
GLISShader | не нужен |
glIsTexture | не нужен |
гллиневидс | gl.LineWidth |
glLinkProgram | TGLProgram.Link |
glPixelStorei | gl.PixelStore |
glPolygonOffset | gl.PolygonOffset |
glReadPixels | TGLFramebuffer.ReadPixels |
glReleaseShaderCompiler | TGLShader.ReleaseCompiler |
glRenderbufferStorage | TGLRenderbuffer.Хранилище |
glSampleCoverage | gl.SampleCoverage |
glScissor | гл.Ножницы |
glShaderSource | TGLShader.SetSource |
glStencilFunc | gl.StencilFunc |
glStencilFuncSeparate | gl.StencilFuncSeparate |
glStencilMask | gl.StencilMask |
glStencilMaskSeparate | gl.StencilMaskSeparate |
glStencilOp | gl.StencilOp |
glStencilOpSeparate | gl.StencilOpSeparate |
glTexImage2D | TGLTexture.Загрузить |
glTexParameter | TGLTexture.MinFilter/MagFilter/WrapS/WrapT |
glTexSubImage2D | TGLTexture.SubUpload |
glUniform* | TGLUniform.SetValue/SetValues |
glUseProgram | TGLProgram.Use |
glValidateProgram | TGLProgram.Validate |
glVertexAttrib* | TGLVertexAttrib.SetValue |
глвертексаттрибпоинтер | TGLVertexAttrib.SetConfig/SetData |
glViewport | гл.Вьюпорт |