Ooogles ist ein ultradünner objektorientierter Delphi-Wrapper um OpenGL-ES 2.0 mit nahezu null Auswirkungen auf die Leistung. Es kann auch zum Erstellen von OpenGL-Anwendungen für Desktop-Plattformen unter Verwendung der OpenGL-ES-Teilmenge von OpenGL verwendet werden.
Dieser Wrapper ist immer noch ziemlich niedrig. Da es sich nicht um eine „Rendering-Engine“ oder ein High-Level-Framework handelt, sind dennoch OpenGL-Kenntnisse erforderlich.
Die Hauptziele von Ooogles bestehen darin, die Verwendung von OpenGL-ES einfacher und weniger fehleranfällig zu machen, Fehlerberichte in DEBUG
Builds anzubieten und ein besseres Code Insight-Erlebnis in der Delphi-IDE zu ermöglichen.
Ooogles verfügt über die folgenden Funktionen:
TGLTexture
und TGLShader
und verhindert so diese Art von Fehlern.GL_INVALID_ENUM
-Fehlern führt. Dieser Wrapper verwendet stattdessen echte Delphi-Enums und verhindert so die meisten dieser Fehler.DEBUG
-Modus werden diese Fehler durch Ausnahmen offengelegt und außerdem alle Warnungen in der Debug-Konsole protokolliert.gl
-Klasse eingeschlossen (die eher wie ein Namespace fungiert). Beispielsweise ist die OpenGL-API glClear
in die Methode gl.Clear
eingeschlossen.DEBUG
Definition und aktivierten Assertionen (die Standardkonfiguration für Debug-Builds) wird jeder OpenGL-Aufruf auf Fehler überprüft und beim Auftreten eines Fehlers eine Ausnahme ausgelöst, die den Fehlertyp und die Methode angibt, in der er aufgetreten ist. Wenn DEBUG
nicht definiert ist oder Zusicherungen deaktiviert sind, wird der gesamte Fehlerprüfcode aus dem Build entfernt, sodass er keine Auswirkungen auf die Leistung hat.DEBUG
Modus mit aktivierten Assertionen Warnungen in der Debug-Konsole protokolliert, wenn Sie vergessen, ein Objekt zu binden, bevor Sie es verwenden (oder wenn derzeit ein anderes Objekt als das von Ihnen verwendete gebunden ist).ExamplesCommon
finden. Der Wrapper bietet keine übergeordneten Funktionen wie die automatische OpenGL-Ressourcenverwaltung. Sie müssen OpenGL-Ressourcen selbst freigeben, wenn Sie sie nicht mehr benötigen. Ressourcen werden normalerweise mit einer Methode namens New
erstellt und mit einer Methode namens Delete
freigegeben. Zum Beispiel:
var
Texture: TGLTexture;
begin
Texture.New;
// Do something with texture
Texture.Delete;
end ;
Möglicherweise füge ich in Zukunft eine automatische Ressourcenverwaltung hinzu, wenn Delphi Unterstützung für Datensatz-Finalisierer erhält.
Außerdem unterstützt der Wrapper nur OpenGL-ES Version 2.0. Die „alte“ Rendering-Pipeline mit fester Funktion der Version 1 wird nicht unterstützt. Möglicherweise füge ich Unterstützung für Version 3.0 und höher hinzu, sobald diese von Delphi mehr Mainstream wird.
Dieser Wrapper hat keine anderen Abhängigkeiten als die Notwendigkeit der FastMath-Bibliothek. Diese Bibliothek bietet (unter anderem) sehr schnelle Vektor- und Matrix-Matheberechnungen, was sie ideal für den Einsatz in Hochleistungsanwendungen (OpenGL) macht.
Um zu beginnen:
FM_COLUMN_MAJOR
zu Ihrem Projekt hinzufügen (für alle Konfigurationen – alle Plattformen). Dies ermöglicht die spaltengroße Speicherung von Matrizen, was für OpenGL-Anwendungen sinnvoller ist.InitOoogles
auf. Dies ist erforderlich, um OpenGL-ES auf OpenGL-Plattformen zu emulieren. Wenn Ihre Anwendung mehrere Kontexte verwendet, müssen Sie InitOoogles einmal für jeden Kontext aufrufen (nachdem Sie ihn aktuell gemacht haben). Schauen Sie sich die Sample.Platform.*
-Einheiten an, um Beispiele dafür zu finden, wann dies aufgerufen werden sollte.Winapi.OpenGL
, iOSapi.OpenGLES
usw.). Um die Verwendung der richtigen OpenGL-Einheiten zu erleichtern, ist es am einfachsten, wenn Sie stattdessen die Datei „OpenGL.inc“ in Ihre Verwendungsklauseln einbeziehen, wie in: uses
{ $INCLUDE 'OpenGL.inc' }
Neslib.Ooogles;
Stellen Sie einfach sicher, dass Sie nach der Include-Datei mindestens eine weitere Einheit „verwenden“.
Im Folgenden finden Sie eine Liste der in Ooogles verwendeten Hauptklassen (eigentlich Datensätze) sowie Links zu ihrer Dokumentation:
attribute
markiert sind.uniform
gekennzeichnet sind.Wenn Sie OpenGL fließend beherrschen, kann Ihnen die folgende Tabelle bei der Übersetzung von einer OpenGL-API in eine Ooogles-Methode hilfreich sein. Es sollte alles ziemlich einfach sein.
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 |
glKlar | gl.Klar |
glClearColor | gl.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.Neu |
glCreateShader | TGLShader.Neu |
glCullFace | gl.CullFace |
glDeleteBuffers | TGLBuffer.Delete |
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 |
glDeaktivieren | gl.Deaktivieren |
glDisableVertexAttribArray | TGLVertexAttrib.Disable |
glDrawArrays | gl.DrawArrays |
glDrawElements | gl.DrawElements |
glEnable | gl.Aktivieren |
glEnableVertexAttribArray | TGLVertexAttrib.Enable |
glFinish | gl.Finish |
glFlush | gl.Spülung |
glFramebufferRenderbuffer | TGLFramebuffer.AttachRenderbuffer |
glFramebufferTexture2D | TGLFramebuffer.AttachTexture |
glFrontFace | gl.FrontFace |
glGenBuffers | TGLBuffer.Neu |
glGenFramebuffers | TGLFramebuffer.Neu |
glGenRenderbuffers | TGLRenderbuffer.Neu |
glGenTextures | TGLTexture.Neu |
glGenerateMipmap | TGLTexture.GenerateMipmap |
glGetBooleanv | verschiedene Get*-Methoden |
glGetFloatv | verschiedene Get*-Methoden |
glGetIntegerv | verschiedene Get*-Methoden |
glGetActiveAttrib | TGLProgram.GetAttributeInfo |
glGetActiveUniform | TGLProgram.GetUniformInfo |
glGetAttachedShaders | TGLProgram.GetAttachedShaders |
glGetAttribLocation | TGLVertexAttrib.Init |
glGetBufferParameteriv | TGLBuffer.Get* |
glGetError | gl.GetError |
glGetFramebufferAttachmentParameteriv | TGLFramebuffer.Get* |
glGetProgramInfoLog | TGLProgram (im DEBUG-Modus) |
glGetProgramiv | TGLProgram.Get* |
glGetRenderbufferParameteriv | TGLRenderbuffer.Get* |
glGetShaderInfoLog | TGLShader (im DEBUG-Modus) |
glGetShaderSource | TGLShader.GetSource |
glGetShaderiv | TGLShader.Get* |
glGetString | gl.Get* |
glGetTexParameter* | TGLTexture.Get* |
glGetUniform | TGLUniform.GetValue |
glGetUniformLocation | TGLUniform.Init |
glGetVertexAttrib* | TGLVertexAttrib.Get* |
glGetVertexAttribPointerv | TGLVertexAttrib.GetOffset/GetData |
glHinweis | TGLTexture.MipmapHint |
glIsBuffer | nicht nötig |
glIsEnabled | gl.IsEnabled |
glIsFramebuffer | nicht nötig |
glIsProgram | nicht nötig |
glIsRenderbuffer | nicht nötig |
glIsShader | nicht nötig |
glIsTexture | nicht nötig |
glLineWidth | gl.LineWidth |
glLinkProgram | TGLProgram.Link |
glPixelStorei | gl.PixelStore |
glPolygonOffset | gl.PolygonOffset |
glReadPixels | TGLFramebuffer.ReadPixels |
glReleaseShaderCompiler | TGLShader.ReleaseCompiler |
glRenderbufferStorage | TGLRenderbuffer.Storage |
glSampleCoverage | gl.SampleCoverage |
glScissor | gl.Schere |
glShaderSource | TGLShader.SetSource |
glStencilFunc | gl.StencilFunc |
glStencilFuncSeparate | gl.StencilFuncSeparate |
glStencilMask | gl.StencilMask |
glStencilMaskSeparate | gl.StencilMaskSeparate |
glStencilOp | gl.StencilOp |
glStencilOpSeparate | gl.StencilOpSeparate |
glTexImage2D | TGLTexture.Upload |
glTexParameter | TGLTexture.MinFilter/MagFilter/WrapS/WrapT |
glTexSubImage2D | TGLTexture.SubUpload |
glUniform* | TGLUniform.SetValue/SetValues |
glUseProgram | TGLProgram.Use |
glValidateProgram | TGLProgram.Validate |
glVertexAttrib* | TGLVertexAttrib.SetValue |
glVertexAttribPointer | TGLVertexAttrib.SetConfig/SetData |
glViewport | gl.Viewport |