Windows 10 on ARM における OpenGL に関するあれこれ

## OpenGL のライブラリがない…
現在提供されている Windows SDK (執筆時点では10.0.19041.0) には ARM64 用の OpenGL 関係のライブラリが収録されていません。

![gl-lib_cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/9fb26759-a618-4fa5-0bf2-f323c9a7b72b.png)

これにはいろいろと理由が推測されてますが、大ざっぱなところは

- デスクトップ向け OpenGL だとパフォーマンスが出ない説  
（Snapdragon はモバイルチップなので、GPU が OpenGL ES 向けに最適化されていると言う推測）
- Windows は DirectX が標準なんだから、それを強制すればいいじゃん説  
（いわゆる Apple 的なあれですねｗ）
- Microsoft や Qualcomm の開発リソースが不足している説  
（まあ、売れてないから優先度が下がるのは仕方ないよねぇ…😅）

というような見解が巷にはあります。

とは言え、個人的な趣味ではあるものの OSS なライブラリ等をビルドして使用しようとすると、やっぱり OpenGL ライブラリが欲しくなるのです。

自分に技術力（と、やる気？）があれば、代替えのライブラリ（GLES や Angle それこそ DirectX 等々）を構築して使用したりするのもありなのでしょうが、得てしてこれらは適用先ソースのコード修正が大規模になりがちです。

そんな自分への福音になるかは分かりませんが、一応、最近では [こちらの Microsoft のブログ記事](https://devblogs.microsoft.com/directx/announcing-the-opencl-and-opengl-compatibility-pack-for-windows-10-on-arm/) にあるように、後入れプラグイン方式による提供の動きがあります。
（※ プラグイン提供に合わせて、開発用は今後の WinSDK に収録される見通し）


## OpenGL のライブラリあるじゃん！（ただし、DLL）
まあ、そんな状況ではあるものの、今現在この状況を変えられるような情報はないものかと、ちょこちょこググっていた折に、 [こちらの stack overflow 記事](https://stackoverflow.com/questions/65170096/opengl32-lib-for-windows-arm64) を見つけました。
「おーっ、強引にバイパスさせるかぁ！」と感心するとともに、「OS側に opengl32.dll あるじゃん！😲」とちょっとテンション上がってサクッと Windows フォルダ内を見てみたところ、

![opengl32_cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/f0f633a9-0c17-76e4-80a4-24cc5a559f15.png)

上図のように、不思議なほどに沢山の（それもサイズの違う…）opengl32.dll が見つかりました。
他にも調べてみると glu32.dll と glmf32.dll がありました。
（※ x86 エミュレーション用や ARM32 用と推測されますが、多過ぎ…）


## 強引にやっちゃっていい？？
そうやって調べているときにふと「そういえば昔 MinGW とかで提供されてない奴があった時に DLL から lib ファイルを作った記憶があるなぁ」と思い出したので、またちょいとググったところ、 [Qiita に記事がありました。](https://qiita.com/iwatake2222/items/3caf294726918c3af9e6)
（良記事ありがとうございます！）

記事に沿った作業で opengl32.lib, glu32.lib, glmf32.lib がサクッと出来上がりました。
（※ ダイナミックリンク用インポートライブラリです。スタティック用ではありません）
ベースにしたのはネイティブ確率が高そうな System32 直下の奴です。（上のリストで囲っている奴）

とりあえず、 [こちらのサイト](https://www.hiramine.com/programming/modelviewer2015/index.html) から OpenGL のサンプルソースを持ってきて（サイト主様ありがとうございます!）ARM64用ビルドして確認してみたところ、基本的な所は問題なさそうな感じでした。

![ARM64-Win_OpenGL_20210123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/1a32f6a0-282c-fbaf-69d5-d401ac7453c0.png)

## こ奴、天狗になっておるぞ！
いやぁ、なんかダイナミックリンク用だけとはいえ、OpenGL ライブラリが手に入っちゃったので、調子に乗って vcpkg で、あれこれと ARM64 用に各種ライブラリをビルドしまっくっちゃいましたｗ

![ARM64-Win_vcpkg-list_20210123_cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/3b5210d1-42ad-cb20-b72f-bf0675483446.png)

とは言え、ARM64 用のビルドは現状いろいろと罠があり、一筋縄ではいかないことが多いですけどね…😅

なお、Windows 10 on ARM 上での vcpkg の効率を幾分でもよくするために、ちょこちょこと使用モジュールをネイティブ化してます。
vcpkg 自体をはじめ CMake や Ninja その他ビルドツール内の PowerShell や 7zip なんかも入れ替えてあります。

あと、vcpkg 作業自体には使用していないけど [こちらの Arm Community の記事](https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/native-clang-for-windows-on-arm) を参考にして、Clang（自分のは LLVM R11）を ARM64 ビルドしたり、SakuraEditor（bregonig 含む）なんかも ARM64 ビルドしております。

## 調子ついでに Python（ARM64）での OpenGL
[以前記事にした](https://qiita.com/Daru-IBN5100/items/b41ee3207409b0d78de6) Python（ARM64）ですが、現在 V3.9x を使用しています。
前回は本体のことについてのみでしたが、やっぱり Python といえば pip ですよね！
とは言うものの、こちらも現状いろいろと罠があり、特にバイナリを含むパッケージは一筋縄ではいかないです…
そんな折、[こちらの記事](https://cloudbase.it/python-on-windows-arm64/) を見つけました。
この記事を参考にあれやこれやと試行錯誤して、現状以下のようなモジュールを pip インストールしてます。
（一部、超趣味的な dragonpyemulator なんてものも入れていますが気にしないでくださいｗ）

![ARM64-Win_pip-list_20210123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/83f34c9c-b159-6f06-b7d1-6138e9bafbea.png)

とりあえず、PyOpenGL を試してみるのに PyOpenGL-Demo も入れて試そうとしたのですが、これ Python2系 のソースなんですね… orz
困った時のぐぐ様頼みと言うことで、ぐぐ様にご紹介いただいた、[こちらの方のブログ記事](http://ytyaru.hatenablog.com/entry/2018/06/24/000000) や [こちらのQiita記事](https://qiita.com/ousttrue/items/cf8cfbbfadf686b6c338) を参考に写経いたしました。
（ブログ主様および記事主様ありがとうございました<(_ _)>）

すべてのソースが修正できたわけではありませんが、まあ、7割くらいは問題なく動きました。
（※ 以下のスクショは静止状態ですが、全部ぐるぐる動くタイプのデモです。）

![ARM64-Win_PyOpengl_20210123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/2f78c411-0021-33ce-0b16-b75266edd61f.png)

## おわりに
Apple が M1 Mac を出してから、にわかに ARM 系のエコシステム状況が変わりつつあるような気もしますが、相も変わらず Windows 10 on ARM は、なかなか相手にしてもらえないようです…😢
それでも、古のホビーパソコン（8bit系 BASICマイコン）のような、「ないものは作る魂」を養えるｗ 良いアーキテクトマシン だと思っています。
よろしければ皆様も Windows 10 on ARM ワールドに足を踏み入れてみませんか？
(○・ω・)rﾞ ｵｲﾃﾞ～