Skip to content

MetalANGLE - OpenGL ESからApple Metal APIへの変換レイヤー

原文

GoogleのANGLEプロジェクトをフォークしたものです。Metal APIのバックエンドサポートを追加しています。Appleは2018年にOpenGL(ES)の非推奨を発表しました。そこで、MetalANGLEの目的は、OpenGL ESの描画コールをMetalの描画コールにフード内で変換することにより、OpenGL ESアプリケーションがAppleプラットフォーム上で引き続き動作するようにすることです。また、OpenGL ES & Metalの相互運用もサポートします。

2021年6月30日更新: このレポのOpenGL ES 3.0をMetalで実装するコードのほとんどは、公式の ANGLE レポにマージされています。当初、Metalのバックエンドの開発はここだけで行われていました。アップル社も修正を行っており、その変更を公式の ANGLE にマージしている最中なので、現在はそうではありません。現在の [MetalANGLEと公式ANGLEの違い] (#differences-between-metalangle-and-googles-angle) を参照してください。

MetalベースのWebGLベンチマーク(gles3-dev branchのコードをベースにした予備的なものです。)

  • Metal(54fps)対ネイティブOpenGL(46fps)で20k匹の魚を描画。:
  • このベンチマークは、AMD Radeon Pro 560 GPUを使用したChromiumブラウザ上でhttps://webglsamples.org/aquarium/aquarium.htmlを実行します。.

現在のMetalバックエンドの実装状況

  • MetalANGLEはANGLEの公式レポに移行されました。現在のMetalANGLEと公式ANGLEの違いをご覧ください。
  • OpenGL ES 2.0 の機能は100%完成しています。
  • OpenGL ES 3.0 の状態になります。
    • [x] オクルージョンのクエリ。
    • [x] MSAA.
    • [x] 複数のレンダーターゲット (古い iOS GPU では、ピクセルストレージの制限 のため、すべての GL フォーマットがサポートされているわけではありません。問題64](https://github.com/kakashidinho/metalangle/issues/64)を参照してください)。
    • [x] 3D、アレイ、シャドウテクスチャ。
    • [x] テクスチャースウィズル (supported on iOS 13.0+, macOS 10.15+ only).
    • [x] ユニフォームバッファー。
    • [x] フェンスシンク (supported on iOS 12.0+, macOS 10.14+ only).
    • [x] ピクセルバッファオブジェクト。
    • [ ] プリミティブなリスタートMetalのプリミティブリスタートは確実に動作しません。
    • [ ] 最後に生成された頂点でフラットシェーディングを行う。Metalのデフォルトは最初の頂点です。
    • [x] フィードバックを変換する。
  • OpenGL ES 1.0 は使用することをお勧めしません。この実装はオリジナルの ANGLE プロジェクトによって積極的にメンテナンスされておらず、現在バグだらけで完全には準拠していない。
  • 基本的なサンプルはすべて動作しています。
  • ANGLEのエンドツーエンドテストは、ほぼ全て合格しています. 失敗したテストの一覧を参照してください。
  • OpenGL ES 2.0コンフォーマンステストの98%に合格. 90%以上のOpenGL ES 3.0コンフォーマンステストに合格. Khronos VK-GL-CTSをご参照ください。
  • これらの拡張機能は実装されています。
  • MGLKitユーティリティクラスが追加されました。AppleのGLKitと似たような機能を提供します。
  • Urho3Dエンジンのデモは、MetalANGLEを使用して問題なくテストされています。Urho3D's MetalANGLE integration testing branchを参照してください。
  • Irrlicht EngineのMetalANGLEサンプルとの連携。 https://github.com/kakashidinho/irrlicht.
  • Metalとの相互運用がサポートされています。Qtの例: https://github.com/kakashidinho/qml-metalangle を参照してください。
  • No GL_TRIANGLE_FAN & GL_LINE_LOOP support in draw calls yet.
  • Metalはバッファオフセットが4バイトの倍数でないことや、アトリビュートサイズの倍数でないことを許しません。したがって、サポートされていないオフセット、ストライド、および頂点フォーマットを使用する描画コールは、MetalANGLEがオンザフライで変換を行うことを余儀なくされます。
  • MSAA is not supported yet.
  • 古いOpenGL ES 2.0のみの実装は、gles2 branchで見ることができます。
  • 対応プラットフォーム:
    • MetalANGLEは、Macの MacOS 10.13+ のみ対応しています。.
    • iOSの場合、最小サポートバージョンは iOS 9.0 です。それ以前のバージョンでは、Metalの代わりにApple OpenGL ESのネイティブ実装を使用するようになります。さらに、ほとんどのサンプルアプリは iOS11.0+ 用にコンパイルされています。そのため、10.0以下のデバイスでサンプルアプリをテストしたい場合、一部のもの(例:MGLKitSampleApp_ios9.0)を除き、実行することはできません。
    • iPhone 5以下はサポート対象外です。
    • MacCatalyst 13.0+ に対応しています。

TODO lists

  • [ ] ANGLEのすべてのテストに合格していることを確認。
  • [x] Support GL_TRIANGLE_FAN & GL_LINE_LOOP by generating index buffer on the fly using Metal compute shader.
  • [x] Use compute shader to convert unsupported offsets, strides & vertex formats.
  • [x] Support MSAA.
  • [ ] OpenGL ES 3.0に完全対応。

MacOS & iOS用Metal ANGLEのビルド方法

MetalバックエンドのDevセットアップ手順をご覧ください。

現在、便宜上、MetalANGLEは ios/xcodemac/xcode フォルダにあるXcodeプロジェクトを使ってビルドすることもできます。このXcodeプロジェクトでは、アップルが提供するGLKitのクラスである CAEAGLContext, MGLLayer, MGLKView, GLKViewController と同様のユーティリティラッパーである MGLKit も構築されています。このライブラリを使ったiOSアプリのサンプルは MGLKitSamples.xcodeproj を開いてください。この documents には GLKit アプリを MGLKit に移植するためのいくつかのガイドが含まれています。

それでも、MetalバックエンドのDevセットアップ手順 にあるように、必要な環境と依存関係を適切に設定することが先決です。

MetalANGLEとGoogleのANGLEの相違点

  • 2021年6月以前は、Metalのバックエンドのコードの大半は MetalANGLEANGLE で共有されています。
  • 2021年8月~9月以降、アップルから直接 ANGLE リポジトリにいくつかの変更が加えられる予定です。これらの変更は、開発上のコンフリクトのため MetalANGLE に含まれないかもしれません。Appleの変更のほとんどは、WebkitのWebGLの標準に役立つもので、通常の使用では最適なパフォーマンスが得られないかもしれません。Apple からの変更点は以下の通りです。
    • フラットシェーディングの最後の挑発頂点をサポートするために、 インデックスバッファをオンザフライで書き直しました。これは、OpenGL ES のフラットシェーディングの仕様に準拠 するのに役立ちますが、フラットシェーディングを使用する描画コールが 遅くなります。多くの使用例では、フラットシェーディングが最後の頂点と最初の頂点 のどちらを使用するかは、ユーザは気にしないでしょう。
  • MetalANGLE は iOS をサポートし、Apple の非推奨 API である EAGL & GLKit を模倣した MGLKit などの高レベル API を含んでいます。これらの機能は ANGLE にマージされることはないでしょう。なぜなら ANGLE プロジェクトは近い将来 iOS をサポートする予定がないからです。