Ooogles est un wrapper Delphi ultra-mince orienté objet autour d'OpenGL-ES 2.0 avec un impact quasi nul sur les performances. Il peut également être utilisé pour créer des applications OpenGL pour les plates-formes de bureau à l'aide du sous-ensemble OpenGL-ES d'OpenGL.
Ce wrapper est encore assez bas. Il ne s'agit pas d'un "moteur de rendu" ou d'un framework de haut niveau, vous avez donc toujours besoin de connaissances OpenGL.
Les principaux objectifs d'Ooogles sont de rendre l'utilisation d'OpenGL-ES plus facile et moins sujette aux erreurs, en offrant un rapport d'erreurs dans les versions DEBUG
et une meilleure expérience Code Insight dans l'IDE Delphi.
Ooogles présente les fonctionnalités suivantes :
TGLTexture
et TGLShader
, empêchant ce type d'erreurs.GL_INVALID_ENUM
. Ce wrapper utilise à la place de véritables énumérations Delphi, évitant ainsi la plupart de ces erreurs.DEBUG
, il exposera ces erreurs via des exceptions et enregistrera également tous les avertissements dans la console de débogage.gl
(qui agit davantage comme un espace de noms). Par exemple, l'API OpenGL glClear
est enveloppée dans la méthode gl.Clear
.DEBUG
et les assertions activées (la configuration par défaut pour les builds Debug), chaque appel OpenGL est vérifié pour les erreurs et une exception est levée lorsqu'une erreur se produit, indiquant le type d'erreur et dans quelle méthode elle s'est produite. Lorsque DEBUG
n’est pas défini ou que les assertions sont désactivées, tout le code de vérification des erreurs est supprimé de la build afin qu’il n’ait aucun impact sur les performances.DEBUG
avec les assertions activées, des avertissements seront enregistrés dans la console de débogage si vous oubliez de lier un objet avant de l'utiliser (ou lorsqu'un objet différent de celui que vous utilisez est actuellement lié).ExamplesCommon
. Le wrapper ne fournit pas de fonctionnalités de niveau supérieur telles que la gestion automatique des ressources OpenGL. Vous devez libérer vous-même les ressources OpenGL lorsque vous n'en avez plus besoin. Les ressources sont généralement créées à l'aide d'une méthode appelée New
et publiées à l'aide d'une méthode appelée Delete
. Par exemple:
var
Texture: TGLTexture;
begin
Texture.New;
// Do something with texture
Texture.Delete;
end ;
Je pourrai ajouter la gestion automatique des ressources à l'avenir si et quand Delphi obtient la prise en charge des finaliseurs d'enregistrement.
De plus, le wrapper ne prend en charge qu'OpenGL-ES version 2.0. Il ne prend pas en charge « l’ancienne » version 1 du pipeline de rendu à fonction fixe. Je pourrai ajouter la prise en charge de la version 3.0 et ultérieure une fois qu'elle sera proposée par Delphi et deviendra plus courante.
Ce wrapper n'a aucune dépendance autre que la nécessité de la bibliothèque FastMath. Cette bibliothèque offre (entre autres choses) des calculs mathématiques vectoriels et matriciels très rapides, ce qui la rend idéale pour une utilisation dans des applications hautes performances (OpenGL).
Pour commencer :
FM_COLUMN_MAJOR
à votre projet (pour Toutes les configurations - Toutes les plateformes). Cela permet le stockage des matrices par colonne, ce qui est plus logique pour les applications OpenGL.InitOoogles
. Ceci est nécessaire pour émuler OpenGL-ES sur les plateformes OpenGL. Si votre application utilise plusieurs contextes, vous devez appeler InitOoogles une fois pour chaque contexte (après l'avoir rendu actuel). Jetez un œil aux unités Sample.Platform.*
pour savoir quand appeler cela.Winapi.OpenGL
, iOSapi.OpenGLES
etc). Pour faciliter l'utilisation des unités OpenGL correctes, il est plus simple d'inclure le fichier 'OpenGL.inc' dans vos clauses use, comme dans : uses
{ $INCLUDE 'OpenGL.inc' }
Neslib.Ooogles;
Assurez-vous simplement d'"utiliser" au moins une autre unité après le fichier d'inclusion.
Voici une liste des principales classes (en fait des enregistrements) utilisées dans Ooogles, ainsi que des liens vers leur documentation :
attribute
dans un vertex shader.uniform
dans un vertex ou un fragment shader.Si vous maîtrisez OpenGL, le tableau suivant peut vous être utile pour traduire une API OpenGL vers une méthode Ooogles. Tout devrait être assez simple.
OpenGL | Ooogles |
---|---|
glActiveTexture | TGLTexture.BindToTextureUnit |
glAttachShader | TGLProgram.AttachShader |
glBindAttribLocation | 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 |
glBufferData | TGLBuffer.Data |
glBufferSubData | TGLBuffer.SubData |
glCheckFramebufferStatus | TGLFramebuffer.Status |
glEffacer | gl.Effacer |
glClearColor | gl.ClearColor |
glClearDepthf | gl.ClearDepth |
glClearPochoir | gl.ClearStencil |
glColorMask | gl.ColorMask |
glCompileShader | TGLShader.Compile |
glCompressedTexImage2D | TGLTexture.UploadCompressed |
glCompressedTexSubImage2D | TGLTexture.SubUploadCompressed |
glCopieTexImage2D | TGLTexture.Copie |
glCopieTexSubImage2D | TGLTexture.SubCopy |
glCréerProgramme | TGLProgram.Nouveau |
glCréerShader | TGLShader.Nouveau |
glCullFace | gl.CullFace |
glSupprimerBuffers | TGLBuffer.Supprimer |
glDeleteFramebuffers | TGLFramebuffer.Delete |
glSupprimerProgramme | TGLProgram.Delete |
glDeleteRenderbuffers | TGLRenderbuffer.Delete |
glSupprimerShader | TGLShader.Delete |
glSupprimerTextures | TGLTexture.Supprimer |
glDepthFunc | gl.DepthFunc |
glDepthMask | gl.DepthMask |
glDepthRangef | gl.DepthRange |
glDetachShader | TGLProgram.DetachShader |
glDésactiver | gl.Désactiver |
glDisableVertexAttribArray | TGLVertexAttrib.Disable |
glDrawArrays | gl.DrawArrays |
glDrawElements | gl.DrawElements |
glActiver | gl.Activer |
glEnableVertexAttribArray | TGLVertexAttrib.Enable |
glFinition | gl.Finition |
glFlush | gl.Flush |
glFramebufferRenderbuffer | TGLFramebuffer.AttachRenderbuffer |
glFramebufferTexture2D | TGLFramebuffer.AttachTexture |
glFrontFace | gl.FrontFace |
glGenBuffers | TGLBuffer.Nouveau |
glGenFramebuffers | TGLFramebuffer.Nouveau |
glGenRenderbuffers | TGLRenderbuffer.Nouveau |
glGenTextures | TGLTexture.Nouveau |
glGenerateMipmap | TGLTexture.GenerateMipmap |
glGetBooleanv | diverses méthodes Get* |
glObtenirFloatv | diverses méthodes Get* |
glObtenirEntierv | diverses méthodes Get* |
glGetActiveAttrib | TGLProgram.GetAttributeInfo |
glGetActiveUniform | TGLProgram.GetUniformInfo |
glGetAttachedShaders | TGLProgram.GetAttachedShaders |
glGetAttribLocation | TGLVertexAttrib.Init |
glGetBufferParameteriv | TGLBuffer.Get* |
glObtenirErreur | gl.GetError |
glGetFramebufferAttachmentParameteriv | TGLFramebuffer.Get* |
glGetProgramInfoLog | Programme TGL (en mode DEBUG) |
glGetProgramiv | TGLProgram.Get* |
glGetRenderbufferParameteriv | TGLRenderbuffer.Get* |
glGetShaderInfoLog | TGLShader (en mode DÉBOGAGE) |
glGetShaderSource | TGLShader.GetSource |
glObtenirShaderiv | TGLShader.Get* |
glObtenirChaîne | gl.Obtenir* |
glGetTexParamètre* | TGLTexture.Get* |
glObtenirUniforme | TGLUniform.GetValue |
glGetUniformLocation | TGLUniform.Init |
glGetVertexAttrib* | TGLVertexAttrib.Get* |
glGetVertexAttribPointerv | TGLVertexAttrib.GetOffset/GetData |
glIndice | TGLTexture.MipmapHint |
glIsBuffer | pas nécessaire |
glIsEnabled | gl.IsEnabled |
glIsFramebuffer | pas nécessaire |
glIsProgramme | pas nécessaire |
glIsRenderbuffer | pas nécessaire |
glIsShader | pas nécessaire |
glIsTexture | pas nécessaire |
glLineWidth | gl.LineWidth |
glLinkProgram | TGLProgram.Link |
glPixelStorei | gl.PixelStore |
glPolygonOffset | gl.PolygonOffset |
glLirePixels | TGLFramebuffer.ReadPixels |
glReleaseShaderCompiler | TGLShader.ReleaseCompiler |
glRenderbufferStorage | TGLRenderbuffer.Storage |
glSampleCoverage | gl.SampleCoverage |
glCiseaux | gl.Ciseaux |
glShaderSource | TGLShader.SetSource |
glStencilFunc | gl.StencilFunc |
glStencilFuncSeparate | gl.StencilFuncSeparate |
glPochoirMasque | gl.StencilMask |
glStencilMaskSéparé | gl.StencilMaskSeparate |
glStencilOp | gl.StencilOp |
glStencilOpSeparate | gl.StencilOpSeparate |
glTexImage2D | TGLTexture.Télécharger |
glTexParamètre | TGLTexture.MinFilter/MagFilter/WrapS/WrapT |
glTexSubImage2D | TGLTexture.SubUpload |
glUniforme* | TGLUniform.SetValue/SetValues |
glUseProgram | TGLProgram.Utilisation |
glValidateProgramme | TGLProgram.Validate |
glVertexAttrib* | TGLVertexAttrib.SetValue |
glVertexAttribPointer | TGLVertexAttrib.SetConfig/SetData |
glViewport | gl.Viewport |