OSDN Ticket Archive


Ticket #46252

iOS版 3DグラフィックスAPIをOpenGLからMetalに移行

登録: 2022-12-11 00:01 最終更新: 2022-12-11 00:42

報告者:
yknk
担当者:
yknk
チケットの種類:
サポートリクエスト
状況:
完了
コンポーネント:
MIDITrail Ver.2.x.x for iOS
マイルストーン:
Version 2.0.0 for iOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

Appleは、2018年のmacOS 10.14 MojaveとiOS 12から、OpenGLを非推奨APIと宣言している。 MIDITrailは初回リリース時点からOpenGLを利用してきたが、iOS版の開発を継続するため、 OpenGLからMetalへの移行を実施する。

本修正を契機として、MIDITrailのメジャーバージョンをVer.1からVer.2に変更する。

MIDITrail Ver.1.3.6のサポート対象OSは、iOS 9以降である。 Metalが利用可能となったのは、Apple A7以降のiOSデバイスかつiOS 8以降である。 Apple A7を採用しているiOSデバイスはiPhone 5s、iPad Air第1世代、iPad mini第2世代、iPad mini 3である。 これらのiOSデバイスはiOS 12までサポートされていることから、MIDITrail Ver.2.0.0でのサポート対象OSはiOS 12以降に変更する。

以下のチケットをマージする。

  • #45699 macOS版 3DグラフィックスAPIをOpenGLからMetalに移行

チケットの履歴

2022-12-11 00:01 更新者: yknk
  • 新しいチケット "iOS版 3DグラフィックスAPIをOpenGLからMetalに移行" が作成されました
2022-12-11 00:37 更新者: yknk
コメント

対策1:プロジェクト設定

フレームワーク

フレームワークにMetalを追加してOpenGLを外す。

Targets/General/Frameworks, Libraries, and Embedded Content
 * Metal.framework 追加
 * MetalKit.framework 追加
 * OpenGLES.framework 削除

デプロイターゲット

Deployment Targetを9.0から12.0に変更する。

PROJECT/ MIDITrail / Info / Deployment Target
  iOS Deployment Target: Default -> 12.0
TARGETS / MIDITrail / General
  Minimum Deployments: iOS  9.0 -> 12.0

ビルド設定

手動による設定変更なし。

デバッグ用設定

シェーダのデバッグ機能を利用するため設定を追加する。

Projects/Build Settings/Metal Compiler - Build Options
Produce Debugging Information
  Debug   : Yes, include source code
  Release : No

2022-12-11 00:37 更新者: yknk
コメント

対策2:グラフィックライブラリ修正

修正方針

  • OpenGLのラッパークラスであるOGLUtilityのクラス群を、Metalのラッパークラスとして全面的に書き換える。
  • クラス名(OGLXxxxx)は変更せずに引き継ぎ、ライブラリ利用者側の修正範囲を最小限にする。
  • 外部I/Fも可能な限り維持する。
  • Windows版ソースコードを取り込む際にダミークラスとしていたOGLDeviceを、描画制御の橋渡し役として利用する。
  • OpenGLの座標は右手系だが、MetalはDirectXと同じく左手系であるため、Z軸座標のプラスマイナスを反転する。LH2RHマクロの符号反転を無効化する。
  • 左手系の変換行列を利用する。行列の記述方法は、Metal,OpenGL共に列優先(Column major order)。

シェーダ追加

  • OGLShaders.h, OGLShaders.metal を追加。

平行投影カメラクラス追加

  • OGLCameraOrthoクラスを新規追加。背景やカウンターの描画処理をシンプルにするために導入。
2022-12-11 00:39 更新者: yknk
コメント

対策3:リソース修正

MTMainView_iPhone.xib, MTMainView_iPad.xib

Xocdeがセーフエリアを考慮して勝手にレイアウトを破壊することを防ぐため、上下左右に配置していたガイド画像のView属性を変更する。

  • Layoutを"Inferred(Constraints)"から"Autoresizing Mask"に変更。
  • Layout Margins / Safe Area Relative Margins のチェックを外す。

最背面に配置していた画像描画対象のVivewを削除する。MTKViewをコードで生成して制御するため。

MTSettingView_iPhone.xib, MTSettingView_iPad

設定画面でグループを識別しやすくするため、背景色を白から灰色に変更する。

  • View属性のBackgroundを"System Background Color"から"Sysmte Grouped Background Color"に変更。
2022-12-11 00:39 更新者: yknk
コメント

対策4:メインビュー修正

修正方針

  • Ver.1では、ディスプレイリンクを使用してレンダリングしていた。
  • Ver.2では、ディスプレイリンクの使用を取りやめ、MetalKitのMTKViewを利用してレンダリングする。

MTMainViewCtrl

  • メンバからOpenGLコンテキストとバッファを削除。
  • メンバからUIViewを削除。
  • メンバにMTKViewとメタルデバイスを追加。
  • メンバにタイマーを追加。アプリがバックグラウンドに遷移して画面描画処理が止まった場合も、シーケンサメッセージ処理を継続するため。
  • クラス全体からOpenGLとディスプレイリンクの処理を削除。メソッド単位の修正内容は記載しない。

MTMainViewCtrl:initWithFrame

  • Metal初期化処理の呼び出しを追加。

MTMainViewCtrl:dealloc

  • Metalデバイスの破棄処理の呼び出しを追加。

MTMainViewCtrl:initializeMetalView

  • Metalビュー初期化メソッドを追加。

MTMainViewCtrl:terminateMetalView

  • Metalビュー破棄メソッドを追加。

MTMainViewCtrl:initialize

  • レンダラー初期化メソッドの引数変更に対応。
  • バッファクリア処理の呼び出しを削除。

MTMainViewCtrl:getView

  • Metalビューを返却するように修正。

MTMainViewCtrl:viewWillAppear

  • タイマー開始処理を追加。

MTMainViewCtrl:viewDidDisappear

  • タイマー破棄処理を修正。

MTMainViewCtrl:createScene:seqData

  • シーン生成メソッドを追加。

MTMainViewCtrl:startScene:isMonitor

  • 初回描画処理を削除。

MTMainViewCtrl:drawInMTKView

  • Metal描画メソッドを追加。MTKViewのデリゲートであり、自動的に呼び出される。

MTMainViewCtrl:mtkView:drawableSizeWillChange

  • 画面サイズ変更通知メソッドを追加。MTKViewのデリゲートであり、自動的に呼び出される。
  • 通知を利用することはないため、処理なし。

MTMainViewCtrl:onTimer

  • タイマーイベントハンドラを追加。

MTMainViewCtrl:drawProc

  • レンダリングクラスの引数追加対応。

MTMainViewCtrl:touchesBegan:withEvent

  • タッチイベント解析時にMetalビューを指定するように修正。

MTMainViewCtrl:touchesMoved:withEvent

  • タッチイベント解析時にMetalビューを指定するように修正。
2022-12-11 00:39 更新者: yknk
コメント

対策5:アプリケーションクラスの修正

MIDITrailApp:loadGraphicConf

  • サンプルモードの数値を定義値に変更。

MIDITrailApp:createSceneWithType

  • シーンオブジェクト生成処理をメインビュー側に移譲。
2022-12-11 00:39 更新者: yknk
コメント

対策6:シーンクラス共通の修正

シーンクラス共通の修正 MTSceneXXXX

  • OpenGLレンダリングステート設定処理をすべて削除。Metalのレンダリングステート設定処理はOGLPrimitiveクラスに集約。
  • OGLDirLight::SetEnableLights 引数変更対応。
  • ライトON/OFFの明確化。ライトが必要なオブジェクトを描画してから、ライトOFFに切り替えてライト不要のオブジェクトを描画する。

モニタ用シーンクラス共通の修正 MTSceneXXXXLive

  • メンバにMIDI INデバイス名更新フラグm_IsUpdateMIDIINDeviceNameを追加。
  • コンストラクタにMIDI INデバイス名更新フラグの初期化処理を追加。
  • Transformメソッドにて、MIDI INデバイス名更新を検出したときデバイス名をダッシュボードに反映する処理を追加。
  • OnPlayStartメソッドにて、MIDI INデバイス名更新フラグの設定処理を追加。
2022-12-11 00:40 更新者: yknk
コメント

対策7:シーンクラスのライト調整 MTScenePianoRoll3D, MTScenePianoRoll3DLive

MTScenePianoRoll3D::_SetLightColor

  • 鏡面反射光を有効にするためパラメータを0から1に変更。

MTScenePianoRoll3D::_SetLightColor

  • 鏡面反射光を有効にするためパラメータを0から1に変更。
  • 環境光の不透明度を0から1に修正。

MTScenePianoRoll3DLive::_SetLightColor

  • 鏡面反射光を有効にするためパラメータを0から1に変更。

MTScenePianoRoll3DLive::_SetLightColor

  • 鏡面反射光を有効にするためパラメータを0から1に変更。
  • 環境光の不透明度を0から1に修正。
2022-12-11 00:40 更新者: yknk
コメント

対策8:シーンクラスのライト調整 MTScenePianoRollRain, MTScenePianoRollRainLive

ピアノキーボードの画面表示色をVer.1にできるだけ合わせようとしたが、影が黒くなりすぎる問題を解決できなかったため、 2個目のライトを追加して反対方向から照らすことにする。Piano Roll 3Dと同じ。

MTScenePianoRollRain

  • メンバに2個目のライトm_DirLight2を追加。

MTScenePianoRollRain::Create

  • 2個目のライトの初期化処理を追加。
  • ライト1,2のライト色設定処理を追加。
  • ライト1の方向を変更。鏡面反射光の効果を現れやすくするため。

MTScenePianoRollRain::_SetLightColor

  • ライト色設定メソッドを追加。

MTScenePianoRollRain::_SetLightColor2

  • ライト色設定メソッドを追加。

MTScenePianoRollRainLive

  • メンバに2個目のライトm_DirLight2を追加。

MTScenePianoRollRainLive::Create

  • 2個目のライトの初期化処理を追加。
  • ライト1,2のライト色設定処理を追加。
  • ライト1の方向を変更。鏡面反射光の効果を現れやすくするため。

MTScenePianoRollRainLive::_SetLightColor

  • ライト色設定メソッドを追加。

MTScenePianoRollRainLive::_SetLightColor2

  • ライト色設定メソッドを追加。
2022-12-11 00:40 更新者: yknk
コメント

対策9:シーンオブジェクトクラス修正

シーンブジェクト共通の修正

  • OpenGLレンダリングステート設定処理をすべて削除。Metalのレンダリングステート設定処理はOGLPrimitiveクラスに集約。
  • プリミティブオブジェクトの初期化メソッドの引数変更対応。
  • OGLUtilityのクラスのメソッド引数変更対応。
  • 左手系から右手系の座標変換行列設定 transMatrix.RegistScale の処理を削除。

MTBackgroundImage

  • メンバに平行投影カメラオブジェクトm_CameraOrthoを追加。

MTBackgroundImage::Draw

  • カメラオブジェクトの更新処理を追加。

MTDynamicCaption

  • メンバに平行投影カメラオブジェクトm_CameraOrthoを追加。

MTDynamicCaption::Draw

  • カメラオブジェクトの更新処理を追加。

MTStaticCaption

  • メンバに平行投影カメラオブジェクトm_CameraOrthoを追加。

MTStaticCaption::Draw

  • カメラオブジェクトの更新処理を追加。

MTDashboardLive::Create

  • タイトルキャプション設定処理の引数変更に対応。

MTDashboardLive::SetMIDIINDeviceName

  • タイトルキャプション設定処理の引数変更に対応。

MTNoteBox::_MakeMaterial

  • 鏡面反射光の鮮明度を40から20に変更。
  • 発光色の不透明度を0から1に変更。

MTPianoKeyboard::_MakeMaterial

  • 発光色の不透明度を0から1に変更。

MTPianoKeyboardDesign

  • テクスチャUV座標を算出するマクロTEXTURE_POINTについて、画像サイズを639x639から640x640に変更。macOS版と合わせる。

MTPictBoard::_CreateVertexOfBoard

  • テクスチャ画像の縦横サイズをローカル変数に変更して、コードを読みやすくする。

MTPictBoardRing::_CreateVertexOfBoard

  • テクスチャ画像の縦横サイズをローカル変数に変更して、コードを読みやすくする。
2022-12-11 00:41 更新者: yknk
コメント

対策10:シーンライブラリクラス修正

MTFirstPersonCam::Initialize

  • カメラ初期化時のNearプレーン値を1.0から0.1に変更。カメラに近いポリゴンも描画対象とする。

MTFirstPersonCam::_TransformCamPosition

  • 座標が左手系に変更されたことに伴い、ゲームパッド操作(左右)反映処理のプラスマイナスを逆にする。
  • ゲームパッド操作方向(前後/左右)と、移動スピード(前後/左右)の設定が逆になっていたため、入れ替える。(m_VelocityLR, m_VelocityFB)

MTFontTexture::CreateTexture

  • テクスチャ画像最大サイズの定義値名を変更。数値は変更なし。
2022-12-11 00:41 更新者: yknk
コメント

対策11:視点保存の互換性維持

座標系が右手系から左手系に変わったため、視点パラメータZ,Phiのプラスマイナスが逆になった。 しかしVer.1で保存した視点と、Ver.2で保存した視点の互換性を維持するため、 Ver.2で視点を保存するときと、保存した視点を読み出すときに、パラメータZ,Phiのプラスマイナスを逆にする。

MIDITrailApp:loadViewpoint

  • パラメータZ,Phiのプラスマイナスを逆にして読み取る。

MIDITrailApp:saveViewpoint

  • パラメータZ,Phiのプラスマイナスを逆にして保存する。

MTMainViewCtrl:scene_MoveToMyViewpoint

  • パラメータZ,Phiのプラスマイナスを逆にして読み取る。

MTMainViewCtrl:scene_SaveMyViewpoint

  • パラメータZ,Phiのプラスマイナスを逆にして保存する。
2022-12-11 00:41 更新者: yknk
コメント

対策12:シーンクラス カメラ移動方式変更 MTPianoRoll3D, MTPianoRollRing

演奏時間経過に応じて、再生面とカメラをX軸方向に移動させる方式を取りやめ、 再生面とカメラは固定してノートボックスとグリッドボックスを移動させる方式に変更する。 演奏時間が長くなると、再生面とリップルのZファイティングが発生するようになったため。

MTScenePianoRoll3D::OnRecvSequencerMsg

  • 演奏チックタイム通知受信時にチックタイムを反映するオブジェクトを変更。

MTScenePianoRoll3D::_Reset

  • グリッドボックスのリセット処理を追加。

MTScenePianoRollRing::OnRecvSequencerMsg

  • 演奏チックタイム通知受信時にチックタイムを反映するオブジェクトを変更。

MTScenePianoRollRing::_Reset

  • グリッドボックスのリセット処理を追加。

MTGridBox

  • メンバにチックタイムm_CurTickTimeを追加。

MTGridBox::MTGridBox

  • チックタイムの初期化処理を追加。

MTGridBox::Transform

  • チックタイムに応じてグリッドボックスを移動させる。

MTGridBox::SetCurTickTime

  • カレントチックタイム設定メソッドを追加。

MTGridBox::Reset

  • カレントチックタイムリセットメソッドを追加。

MTGridRing

  • メンバにチックタイムm_CurTickTimeを追加。

MTGridRing::MTGridBox

  • チックタイムの初期化処理を追加。

MTGridRing::Transform

  • チックタイムに応じてグリッドボックスを移動させる。

MTGridRing::SetCurTickTime

  • カレントチックタイム設定メソッドを追加。

MTGridRing::Reset

  • カレントチックタイムリセットメソッドを追加。

MTNoteBox::Transform

  • チックタイムに応じた移動ベクトルを取得する処理に変更。ただしチックタイムは更新しない。

MTNoteDesign::GetWorldMoveVector2

  • 世界座標配置移動ベクトル取得メソッドを追加。チックタイムに対応する座標を取得可能とする。

MTNoteDesignRing::GetWorldMoveVector2

  • 世界座標配置移動ベクトル取得メソッドを追加。チックタイムに対応する座標を取得可能とする。
2022-12-11 00:42 更新者: yknk
コメント

対策13:ビューモード設定ファイル

PianoRollRain.ini, PianoRollRainLive.ini, PianoRollRain2D.ini, PianoRollRain2DLive.ini

  • キーボードの色が白くなりすぎないように設定を変更。
    ----
    [PianoKeyboard]
    変更前
    WhiteKeyColor=FFFFFFFF
    BlackKeyColor=FFFFFFFF
    変更後
    WhiteKeyColor=EEEEEEFF
    BlackKeyColor=EEEEEEFF
    
2022-12-11 00:42 更新者: yknk
コメント

対策14:その他修正

MTScenePianoRoll3D

  • テスト用ティーポット描画処理を追加してコメント化。

MTScenePianoRollRain

  • テスト用ティーポット描画処理を追加してコメント化。
2022-12-11 00:42 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません