iOSAppMeshTransform — iOSのアプリ起動メッシュ変形を再現するサンプル

Mobile

概要

このリポジトリは、iOSのアプリ起動時に観察される「画面がメッシュのように変形して現れる」エフェクトを、SwiftUIのUIとMetalのGPUシェーダで再現する試みです。READMEには「iPhone 16 Pro(402 x 874)」向けに作られている旨があり、シェーダ自体は汎用化できるがUI用の画像はサイズ依存であると記載されています。実験的でファイル数は少なく、Metalを使ったリアルタイムなメッシュワープの基本を学ぶのに適したサンプルと言えます。

GitHub

リポジトリの統計情報

  • スター数: 29
  • フォーク数: 0
  • ウォッチャー数: 29
  • コミット数: 5
  • ファイル数: 4
  • メインの言語: Metal

主な特徴

  • Metalシェーダを用いたメッシュベースのワープ(変形)エフェクトを実装
  • SwiftUIと組み合わせて起動アニメーションを再現するサンプル
  • iPhone 16 Pro(402×874)向けに調整済みだが、シェーダは汎用化可能
  • 軽量で教育目的に適した構成(サンプルコード主体)

技術的なポイント

このプロジェクトの中核はGPU側で行う「メッシュ変形(mesh transform)」です。一般的な実装パターンとしては、レンダリング対象となるスクリーンイメージ(アプリのスナップショットやUIイメージ)をテクスチャとしてGPUに渡し、格子(グリッド)状に分割した頂点バッファを用意します。頂点シェーダ側で変形の進行度(time/progress)や形状パラメータを受け取り、各頂点の座標をオフセットしてワープを発生させます。フラグメント(ピクセル)シェーダは変形後のテクスチャ座標でサンプルして最終色を出力します。

本リポジトリではMetal言語でシェーダが書かれており、Swift/SwiftUI側からMTLDeviceやMTLCommandQueue、レンダーパイプラインを構築してMTKViewまたはCAMetalLayerで描画していることが想定されます。SwiftUIとの組み合わせでは、UIViewRepresentableやUIViewControllerRepresentableを介してMetalの描画コンテキストを埋め込み、アニメーション制御はSwift側でタイマーやCADisplayLinkを使って進行度を更新します。パフォーマンス面では、頂点オフセットはGPUで完結させることでCPU負荷を下げ、テクスチャを一度作成して再利用することで転送コストを抑えるのがポイントです。

また、READMEの注記にもある通りシェーダ自体はデバイスサイズを正規化して扱うことで汎用化可能です(ピクセルではなくUV座標で計算する、解像度やアスペクト比をユニフォームで渡すなど)。ただしこのサンプルはUI画像が特定解像度向けに用意されているため、実機で動かす際は画像アセットやレイアウトを調整する必要があります。拡張案としては、頂点ディスプレイスメントにノイズや物理ベースの力学を導入して多様な破綻表現を作る、またはMetalのコンピュートシェーダを使ってメッシュの更新を行い頂点データの更新をGPU側で完結させることでより大規模なメッシュでも高フレームレートを維持する方法が考えられます。

(約1,200字)

プロジェクトの構成

主要なファイルとディレクトリ:

  • LICENSE: file
  • README.md: file
  • iOSAppMeshTransform.xcodeproj: dir
  • iOSAppMeshTransform: dir

README抜粋では「An attempt to recreate the new iOS app launching mesh transform using SwiftUI and Metal. Note: made to run on iPhone 16 Pro (402 x 874 screen). The shader should be generalizable to all device sizes, but the images for the UI are not.」とあり、プロジェクトはXcodeプロジェクトとMetalシェーダ、SwiftUIを組み合わせた構成になっていることが分かります。ファイル数は少なめで、学習や実験を目的とした小規模サンプルです。

使いどころと改良ポイント

  • 学習用途: Metalを使った頂点変形やSwiftUIとの連携を学ぶのに最適。
  • 実装改善: デバイス非依存にするためにアセットをスケーラブルにし、シェーダに解像度パラメータを渡す。
  • 最適化: 大きなメッシュを扱う場合はインデックスバッファとGPU内での頂点更新(compute)を活用。
  • 表現拡張: ノイズ、ベクトル場、複合トランスフォームを導入してよりリッチなアニメーションに。

まとめ

SwiftUIとMetalで実験的に作られた、学習向けのメッシュ変形サンプルです。(約50字)

リポジトリ情報:

READMEの抜粋:

iOSAppMeshTransform

An attempt to recreate the new iOS app launching mesh transform using SwiftUI and Metal.

Note: made to run on iPhone 16 Pro (402 x 874 screen). The shader should be generalizable to all device sizes, but the images for the UI are not.

https://github.com/user-attachments/assets/488eb6c4-dcf4-432a-92d7-39f3a015c0ce

Discussion on twitter