2017年1月8日日曜日

iOSでもOpenGLを使ってみる

現在公開している LaiNES Android を単純に iOS へポーティング中。
https://github.com/suzukiplan/nes-view-ios/tree/open-gles-20
(追記: 諸般の事情で消しました)

Androidでは今回、描画をOpenGLにしてみたので、折角だからiOSも同じ方式を試しておこうと考えました。

iOSでOpenGLを使う場合、Viewのinterface宣言を

@interface NESView : GLKView <GLKViewDelegate>

という風にしました。
・UIViewではなくGLKView(#import <GLKit/GLKit.h>)にする
・GLKViewDelegateを設定

また、このNESViewのイニシャライザ(一応全部)の延長処理で、

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:self.context];

という風にOpenGL/ES 2.0のコンテキストを設定。

あとは、AndroidのC++部分の実装と同じ形で、
・映像の頂点バッファを準備
・シェーダープログラムの作成
GLKViewDelegateのプロトコル(※)でピクセルバッファに対応するポリゴンの色を変更
などの処理を実装。

※これ
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect

OpenGLのインタフェースはC規約で、Androidのものと全く同じです。
だから、ソースコードはAndroidと共有できて良い感じなのですが、なんか微妙に遅い気がする。まだ、iOS固有の部分(core animation layerやUIView)にパフォーマンスの改善余地があるので何とも言えませんが。

あと、glViewportが想定通りに(というかAndroidと同じように)動いていない気がする。(これはコチラのバグかもしれません)

iOS的にはOpenGLよりもMetal推しだろうから、頑張ってOpenGL化するモチベーションがあまり沸かないんですよね。生Metal(?)を叩くのは結構面倒くさそうですが、Unityとかを使っていればAutomatic Graphics APIの項目をチェックするだけで簡単に使えたりします。

OpenGL自体結構deprecate方向に倒れつつある感じですしねぇ。
iOSならMetal、AndroidならVulkanにシフトしている流れです。
(Windowsについては相変わらずDirectXを魔改造する流れ)

Androidは例の如くOSバージョンのフラグメンテーション化が阻害要因になって普及は遅い筈です(本当、Androidなんか無くなれば良いのに)。Vulkanについては、そういった事情もあって聞き慣れない人も多いかもしれないので、(私もあまり詳しく無いですが)念のため補足すると、OpenGLと同じクロノスグループが開発しているもので、OpenGLは元々特定のハードウェアに依存しないように設計されたものですが、それが現代の最新のGPUには合わない(陳腐化した)ものになってしまったとかいう経緯で作られたものだったかと思います。「結局ハードウェアに依存してるじゃねーか」と突っ込みたくなりますね。しかし、実際その通りなので、その結果、より上位層のゲームエンジン(Unityなど)が直にOpenGLなどを叩きプラットフォーム依存を吸収する責務を負うという現代の潮流が出来上がったものと考えられます。その為、VulkanやMetalといった次世代のグラフィックスAPIはOpenGLと比べてローレイヤー寄りの設計になっているので、直に叩こうとするのはかなりツライですが、変態プログラマ諸氏にとっては格好の玩具だったりもします。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...