Ooogles é um wrapper Delphi orientado a objetos ultrafino em torno do OpenGL-ES 2.0 com impacto quase zero no desempenho. Também pode ser usado para criar aplicativos OpenGL para plataformas de desktop usando o subconjunto OpenGL-ES do OpenGL.
Este wrapper ainda é de nível bastante baixo. Não é um “mecanismo de renderização” ou uma estrutura de alto nível, então você ainda precisa de conhecimento sobre OpenGL.
Os principais objetivos do Ooogles são tornar o uso do OpenGL-ES mais fácil e menos sujeito a erros, oferecendo relatórios de erros em compilações DEBUG
e uma melhor experiência de Code Insight no IDE Delphi.
Ooogles tem os seguintes recursos:
TGLTexture
e TGLShader
, evitando esses tipos de erros.GL_INVALID_ENUM
. Este wrapper usa enums Delphi verdadeiros, evitando a maioria desses erros.DEBUG
, ele exporá esses erros por meio de exceções e também registrará quaisquer avisos no console de depuração.gl
estática (que atua mais como um namespace). Por exemplo, a API OpenGL glClear
está agrupada no método gl.Clear
.DEBUG
e asserções habilitadas (a configuração padrão para compilações de depuração), cada chamada OpenGL é verificada em busca de erros e uma exceção é gerada quando ocorre um erro, indicando o tipo de erro e em qual método ele ocorreu. Quando DEBUG
não está definido ou as asserções estão desativadas, todo o código de verificação de erros é removido da compilação, portanto, não tem impacto no desempenho.DEBUG
com asserções habilitadas, avisos serão registrados no console de depuração se você esquecer de vincular um objeto antes de usá-lo (ou quando um objeto diferente daquele que você está usando estiver atualmente vinculado).ExamplesCommon
. O wrapper não fornece recursos de nível superior, como gerenciamento automático de recursos OpenGL. Você mesmo precisa liberar recursos OpenGL quando não precisar mais deles. Os recursos geralmente são criados usando um método chamado New
e liberados usando um método chamado Delete
. Por exemplo:
var
Texture: TGLTexture;
begin
Texture.New;
// Do something with texture
Texture.Delete;
end ;
Posso adicionar gerenciamento automático de recursos no futuro se e quando o Delphi obtiver suporte para finalizadores de registros.
Além disso, o wrapper suporta apenas OpenGL-ES versão 2.0. Ele não oferece suporte ao pipeline de renderização de função fixa da versão 1 "antiga". Posso adicionar suporte para a versão 3.0 e superior assim que for oferecido pelo Delphi se tornar mais popular.
Este wrapper não possui dependências além da necessidade da biblioteca FastMath. Esta biblioteca oferece (entre outras coisas) cálculos matemáticos vetoriais e matriciais muito rápidos, o que a torna ideal para uso em aplicativos de alto desempenho (OpenGL).
Para começar:
FM_COLUMN_MAJOR
ao seu projeto (para Todas as configurações - Todas as plataformas). Isso permite o armazenamento de matrizes em colunas principais, o que faz mais sentido para aplicativos OpenGL.InitOoogles
. Isto é necessário para emular OpenGL-ES em plataformas OpenGL. Se seu aplicativo usar vários contextos, você deverá chamar InitOoogles uma vez para cada contexto (depois de torná-lo atual). Dê uma olhada nas unidades Sample.Platform.*
para obter exemplos de quando chamar isso.Winapi.OpenGL
, iOSapi.OpenGLES
etc). Para facilitar o uso das unidades OpenGL corretas, é mais fácil incluir o arquivo 'OpenGL.inc' em suas cláusulas de uso, como em: uses
{ $INCLUDE 'OpenGL.inc' }
Neslib.Ooogles;
Apenas certifique-se de "usar" pelo menos uma outra unidade após o arquivo incluído.
A seguir está uma lista das principais classes (na verdade, registros) usadas no Ooogles, juntamente com links para sua documentação:
attribute
em um sombreador de vértice.uniform
em um sombreador de vértice ou fragmento.Se você é fluente em OpenGL, a tabela a seguir pode ser útil para traduzir de uma API OpenGL para um método Ooogles. Tudo deve ser bastante simples.
OpenGL | Oogles |
---|---|
glActiveTexture | TGLTexture.BindToTextureUnit |
glAttachShader | TGLProgram.AttachShader |
glBindAttribLocation | TGLVertexAttrib.Bind |
glBindBuffer | TGLBuffer.Bind |
glBindFramebuffer | TGLFramebuffer.Bind |
glBindTexture | TGLTexture.Bind |
glBlendColor | gl.BlendColor |
glBlendEquação | gl.BlendEquação |
glBlendEquationSeparate | gl.BlendEquationSeparate |
glBlendFunc | gl.BlendFunc |
glBlendFuncSeparate | gl.BlendFuncSeparate |
glBufferData | TGLBuffer.Dados |
glBufferSubData | TGLBuffer.SubData |
glCheckFramebufferStatus | TGLFramebuffer.Status |
glLimpar | gl.Limpar |
glClearColor | gl.ClearColor |
glClearDepthf | gl.ClearDepth |
glClearStencil | gl.ClearStencil |
glColorMask | gl.ColorMask |
glCompileShader | TGLShader.Compile |
glCompressedTexImage2D | TGLTexture.UploadComprimido |
glCompressedTexSubImage2D | TGLTexture.SubUploadComprimido |
glCopyTexImage2D | TGLTexture.Copy |
glCopyTexSubImage2D | TGLTexture.SubCopy |
glCreateProgram | Programa TGL.Novo |
glCreateShader | TGLShader.Novo |
glCullFace | gl.CullFace |
glDeleteBuffers | TGLBuffer.Excluir |
glDeleteFramebuffers | TGLFramebuffer.Delete |
glDeleteProgram | TGLProgram.Delete |
glDeleteRenderbuffers | TGLRenderbuffer.Delete |
glDeleteShader | TGLShader.Delete |
glDeleteTextures | TGLTexture.Delete |
glDepthFunc | gl.DepthFunc |
glDepthMask | gl.DepthMask |
glDepthRangef | gl.DepthRange |
glDetachShader | TGLProgram.DetachShader |
glDesativar | gl.Desativar |
glDisableVertexAttribArray | TGLVertexAttrib.Disable |
glDrawArrays | gl.DrawArrays |
glDrawElements | gl.DrawElements |
glEnable | gl.Ativar |
glEnableVertexAttribArray | TGLVertexAttrib.Enable |
glFinish | gl.Finish |
glFlush | gl.Flush |
glFramebufferRenderbuffer | TGLFramebuffer.AttachRenderbuffer |
glFramebufferTexture2D | TGLFramebuffer.AttachTexture |
glFrontFace | gl.FrontFace |
glGenBuffers | TGLBuffer.Novo |
glGenFramebuffers | TGLFramebuffer.Novo |
glGenRenderbuffers | TGLRenderbuffer.Novo |
glGenTextures | TGLTexture.New |
glGenerateMipmap | TGLTexture.GenerateMipmap |
glGetBooleanv | vários métodos Get* |
glGetFloatv | vários métodos Get* |
glGetIntegerv | vários métodos Get* |
glGetActiveAttrib | TGLProgram.GetAttributeInfo |
glGetActiveUniform | TGLProgram.GetUniformInfo |
glGetAttachedShaders | TGLProgram.GetAttachedShaders |
glGetAttribLocation | TGLVertexAttrib.Init |
glGetBufferParameteriv | TGLBuffer.Get* |
glGetError | gl.GetError |
glGetFramebufferAttachmentParameteriv | TGLFramebuffer.Get* |
glGetProgramInfoLog | Programa TGL (no modo DEBUG) |
glGetProgramiv | TGLProgram.Get* |
glGetRenderbufferParameteriv | TGLRenderbuffer.Get* |
glGetShaderInfoLog | TGLShader (no modo DEBUG) |
glGetShaderSource | TGLShader.GetSource |
glGetShaderiv | TGLShader.Get* |
glGetString | gl.Obter* |
glGetTexParameter* | TGLTexture.Get* |
glGetUniform | TGLUniform.GetValue |
glGetUniformLocation | TGLUniform.Init |
glGetVertexAttrib* | TGLVertexAttrib.Get* |
glGetVertexAttribPointerv | TGLVertexAttrib.GetOffset/GetData |
glHint | TGLTexture.MipmapHint |
glIsBuffer | não é necessário |
glIsEnabled | gl.IsEnabled |
glIsFramebuffer | não é necessário |
programa glIs | não é necessário |
glIsRenderbuffer | não é necessário |
glIsShader | não é necessário |
glIsTextura | não é necessário |
glLineWidth | gl.LineWidth |
Programa glLink | TGLProgram.Link |
glPixelStorei | gl.PixelStore |
glPolygonOffset | gl.PolygonOffset |
glReadPixels | TGLFramebuffer.ReadPixels |
glReleaseShaderCompiler | TGLShader.ReleaseCompiler |
glRenderbufferStorage | TGLRenderbuffer.Storage |
glSampleCoverage | gl.SampleCoverage |
Tesoura gl | gl.Tesoura |
glShaderSource | TGLShader.SetSource |
glStencilFunc | gl.StencilFunc |
glStencilFuncSeparate | gl.StencilFuncSeparate |
glStencilMask | gl.StencilMask |
glStencilMaskSeparate | gl.StencilMaskSeparado |
glStencilOp | gl.StencilOp |
glStencilOpSeparate | gl.StencilOpSeparate |
glTexImage2D | TGLTexture.Upload |
Parâmetro glTex | TGLTexture.MinFilter/MagFilter/WrapS/WrapT |
glTexSubImage2D | TGLTexture.SubUpload |
glUniforme* | TGLUniform.SetValue/SetValues |
glUseProgram | Programa TGL.Use |
glValidateProgram | TGLProgram.Validate |
glVertexAttrib* | TGLVertexAttrib.SetValue |
glVertexAttribPointer | TGLVertexAttrib.SetConfig/SetData |
glViewport | gl.Viewport |