Giter VIP home page Giter VIP logo

ax-gfxlib's Introduction

ax Graphics Library "axgl": OpenGLES on Low Level Graphics API (Metal)

For many years, OpenGLES has served as a standard in graphics programming. However, with Apple marking OpenGLES as deprecated, its future support is uncertain. In these transitional times, we offer a bridge to ensure that the invaluable assets created with OpenGLES remain accessible and viable in the contemporary tech landscape.

axgl is a uniquely crafted library that brings OpenGLES's API to life on Metal. With this, you can harness the raw speed and performance of Metal, all while sticking to your familiar OpenGLES codebase.

Key Features

  • Leverage Past Assets: Utilize your existing OpenGLES code and experience the benefits of Apple's cutting-edge technology, Metal.
  • Seamless Transition: axgl mirrors OpenGLES functions, providing a familiar API that requires minimal adjustments to your code.
  • High-Speed Performance: Benefit from Metal's low-level access and optimizations, all within your OpenGLES codebase.

Why axgl?

The technological landscape with Apple is ever-evolving. The deprecation of OpenGLES could significantly impact many developers. axgl was developed as the optimal tool to bridge this technological divide. To safeguard your past investments while smoothly transitioning to future tech, consider axgl as your go-to solution.

Metal backend for iOS

Development Environment

OS: macOS Monterey Version 12.6.2
Xcode: Xcode Version 13.3

How to build

Open the following project from Xcode. AXGLExample/AXGLExample.xcodeproj

Select the target and build the project with Product->Build.

AXGLExample : Sample Program

Since GLES runs on Metal, the implementation is as follows.

Returns a CAMetalLayer in layerClass of a class inheriting from UIView.

+ (id)layerClass
{
  return [CAMetalLayer class];
}

Create a default device for Metal at initialization time and specify the device and pixel format in CAMetalLayer.

- (void)initialize
{
   // Create default device and set Metal's Layer
  _metalLayer = (CAMetalLayer*)[self layer];
  _device = MTLCreateSystemDefaultDevice();
  _metalLayer.device = _device;
  _metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
  _metalLayer.contentsScale = [UIScreen mainScreen].scale;
  // ...
}

Since the Drawable of Metal is different from GLES, an on-screen Framebuffer is constructed by specifying CAMetalLayer as storage and creating a Renderbuffer. For Apple GLES, this is done with the renderbufferStorage method specifying CAEAGLLayer.

- (void)setupOnscreenResources
{
  // Set the context
  BOOL res = [EAGLContext setCurrentContext:_context];
  if (res) {
    // Create Renderbuffer by specifying CAMetalLayer as Storage
    glGenRenderbuffers(1, &_colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
    [_context renderbufferStorageFromLayer:GL_RENDERBUFFER fromLayer:_metalLayer];
    // Create a renderbuffer of depth
    GLsizei rb_width = (GLsizei)([_metalLayer drawableSize].width);
    GLsizei rb_height = (GLsizei)([_metalLayer drawableSize].height);
    glGenRenderbuffers(1, &_depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, rb_width, rb_height);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);
    // Attach to Framebuffer
    glGenFramebuffers(1, &_framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderbuffer);
    // Remove the context
    [EAGLContext setCurrentContext:nil];
  }
}

AXGLExampleSL : Sample using static library

iThis is a sample that creates a static library of libaxgl.a and uses it in an application. The source of the sample program is identical to AXGLExample.

Open the following project from Xcode and build it. AXGLExampleSL/AXGLExampleSL.xcodeproj

Other platform support

ax is a company that specializes in low-level API implementations of 3D Graphics and AI on a variety of hardware. If you are interested in implementing OpenGL in other environments(e.g. Vulkan, DX12), please contact us at [email protected].

Note

This software uses glslang and SPIRV-Cross. Please refer to the following directory for the license.

glslang: axgl/external/glslang

SPIRV-Cross: axgl/external/SPIRV-Cross

OpenGL is a trademark or registered trademark of Hewlett Packard Enterprise in the United States and other countries.

Software licence

The files in this repository are licensed under AGPLv3. For third parties' programs, see corresponding directories under /axgl/external. If you need the commercial license for our AGPLv3 parts, please contact to [email protected]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.