Metalを基礎から日本語で学べる書籍

iOS/macOSのGPUインターフェース、Metalについて書かれた書籍は、英語だと下記2冊がありますが、

- [Metal By Example](http://metalbyexample.com/) [^metalbyexample]
- [Metal Programming Guide](http://www.amazon.co.jp/exec/obidos/ASIN/0134668944/22301-22/ref=nosim/)

2018年9月現在、まだこれらの日本語版は出ていません。Appleのドキュメントも、Metalに関するものは、まだ日本語化されたものはありません。

個人出版ではありますが、日本語では次に紹介する「Metal入門」があります。**日本語初のMetal解説書**であるとともに、自著なので手間味噌にはなりますが、評判も上々です。

## 「Metal入門」の紹介

OpenGLやDirectXといった他の低レベルグラフィックスAPIを扱った経験がない開発者にとって、Metalは**一歩目のハードルが一番高い**のではないかと思いますが、筆者もそんなGPUプログラミング初心者のひとりで、四苦八苦しながら最初の一歩目を乗り越えました。 本書では、そんな「非」熟練者である筆者だからこその視点から、Metalをかみくだいて解説しています。

**全128ページ**。iOS 10.3, Xcode 9.3, Swift 4.1対応。

個人で出版しており、Boothというサイトで電子版（PDF）を販売しております。

<img height="400" alt="Screen Shot 2018-06-06 at 12.35.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/3569fe18-a64a-970e-8132-d0676c12dff3.png">

- https://booth.pm/ja/items/826318

サンプルコードはGitHubよりダウンロード可能です。

## 「Metal入門」の目次

1章 Metal の概要

2章 Metal の基礎

- 2.1 Metalの「最初のハードル」
- 2.2 「背景にある概念」を理解する
- 2.3 Metalの基本クラスとプロトコル
- 2.4 MetalKit

3章 入門その1 - 画像を描画する

- 3.1 描画処理のためのセットアップを行う
- 3.2 画像をテクスチャとしてロードする
- 3.3 描画処理を実行する

4章 入門その2 - シェーダを利用する

- 4.1 Metalシェーダの基礎
- 4.2 「画面全体を一色に塗る」シェーダの実装
- 4.3 CPUプログラム側の実装 

5章 入門その3 - シェーダでテクスチャを描画する

- 5.1 テクスチャを扱うシェーダの実装
- 5.2 テクスチャ座標データをシェーダに渡す
- 5.3 テクスチャをシェーダに渡す
- 5.4 ピクセルフォーマットを合わせる

6章 Metal のハードウェア要件

- 6.1 歴代iOSデバイスのMetalサポート状況
- 6.2 `MTLFeatureSet`
- 6.3 Metal非対応デバイスの判定

7章 GPGPU プログラミング入門

- 7.1 コンピュートシェーダ
- 7.2 スレッドとスレッドグループ
- 7.3 GPGPUの実装例

8章 MSL 入門

- 8.1 Metal のグラフィックスレンダリングパイプライン 
- 8.2 .metalファイルと.metallibファイル
- 8.3 FunctionQualifier(関数修飾子)
- 8.4 AttributeQualifier(属性修飾子)
- 8.5 Address Space Qualifiers(アドレス空間修飾子)
- 8.6 型
- 8.7 GLSLをMSLに移植する

9章 Metal Performance Shaders

- 9.1 デバイスがMPSをサポートしているかを確認する
- 9.2 ガウシアンブラー
- 9.3 `MPSUnaryImageKernel`を継承する他の画像処理カーネルクラス
- 9.4 画像のリサイズ
- 9.5 画像の転置(行と列の入れ替え)

10章 Metal の最適化

- 10.1 スレッドグループサイズの最適化
- 10.2 ArgumentBuffers

11 章 Metal のデバッグ

- 11.1 GPUフレームキャプチャを有効にする
- 11.2 Xcode上でGPUの負荷を確認する
- 11.3 GPUフレームデバッガ
- 11.4 GPUフレームキャプチャをプログラムから制御
- 11.5 InstrumentsのMetalSystemTrace
- 11.6 ラベル
- 11.7 デバッググループ
- 11.8 GPUで利用中のメモリサイズを調べる

12 章 Core Image × Metal

- 12.1 Core ImageとMetalのシームレスな統合
- 12.2 Core Imageのフィルタ結果をMetalで描画する
- 12.3 CoreImageのカスタムフィルタをMetalで書く
- Metalでカーネルを書く利点
- MSLによるカスタムカーネルの実装
- Metalカスタムカーネルを利用するためのビルド設定

13 章 SceneKit × Metal

- 13.1 Metal で SceneKit のマテリアルを描画する
- 13.2 他のSceneKitとMetalの連携機能

14章 ARKit × Metal

- 14.1 マテリアルをMetalで描画する
- 14.2 MetalによるARKitのカスタムレンダリング

15章 Core Video × Metal

- 15.1 Metalでリアルタイム動画処理


## 「Metal入門」の評判

ニッチな書籍ですが、読んだ方には好評をいただいております。

> 「Metal入門」は**入門書とは思えないほどのボリュームと内容**です。自分でアプリを作っていて描画をもっとGPUにやらせたい！と思う事が多々あるので勉強してみたいと思っています。まだ読み始めたばかりですが、 **ここまで初心者にも分かりやすくMetalを解説する本は世界中探してもなかなかないのでは**。

- http://tamablog.firstseed.io/entry/2018/04/22/175626


> 1章２章を読むだけでもかなり価値があると思います。 GPUとCPUが、iPhoneの中でどうなっているのかという全体感を掴めただけでも大きな収穫になりました！

- http://kboy-engineering.hateblo.jp/entry/2018/05/10/001759

> このボリュームとわかりやすさで1500円！ 
> Metalに興味ある人全員必読では

- https://twitter.com/ooba/status/988708315017437184

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Metal入門ざっと読了。<br>まだSceneKitとMetalの連携の部分など理解しきれてない部分もあるけど、このあたりはサンプルコード弄りながら理解していこう。<br>同人誌ながらMetalに関して一通り網羅されてる良書。はっきりいって安い。</p>&mdash; nsʇ‾ɐʞ‾ɐʇ (@ta_ka_tsu) <a href="https://twitter.com/ta_ka_tsu/status/990516004810715136?ref_src=twsrc%5Etfw">2018年4月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/ta_ka_tsu/status/990516004810715136

> ちゃんとMetal入門できた気がする！<br>(今まで適当に書いてたけど意味分かって書けてきた気がする)

- https://twitter.com/odkey_/status/1037678551846146048

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「Metal入門」読みながら遊んでたら、目がしぱしぱするやつできた。寝よ。 <a href="https://t.co/kT42tsTgnL">pic.twitter.com/kT42tsTgnL</a></p>&mdash; 3toshu (@3toshu) <a href="https://twitter.com/3toshu/status/1037382378082066432?ref_src=twsrc%5Etfw">2018年9月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/3toshu/status/1037382378082066432

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シェーダープログラミングに興味を持つ事があって、そういえばいつかの技術書典でMetal入門とかいうメタリカロゴ風の表紙のカッコいい本あったなと思い出し読んだら面白すぎた。Processingやめます。</p>&mdash; Ibanez RGIX27FESM (@ohataken) <a href="https://twitter.com/ohataken/status/1036171289784766464?ref_src=twsrc%5Etfw">2018年9月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/ohataken/status/1036171289784766464

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="ja" dir="ltr">Metal入門を読み始めて、ちょっとMetalについてわかってきた気になってきた<a href="https://t.co/76a9heNGz2">https://t.co/76a9heNGz2</a></p>&mdash; へんてこ@MagicaVoxel本発売中 (@henteko07) <a href="https://twitter.com/henteko07/status/1036096322938388480?ref_src=twsrc%5Etfw">2018年9月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/henteko07/status/1036096322938388480

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">日本語で読める書籍としてはかなり貴重で分かりやすいです。これからMetal触る方はぜひに <a href="https://t.co/tXl5l4UTxz">https://t.co/tXl5l4UTxz</a></p>&mdash; noppe(俺コン/技術書典) (@noppefoxwolf) <a href="https://twitter.com/noppefoxwolf/status/1036107374929403904?ref_src=twsrc%5Etfw">2018年9月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/noppefoxwolf/status/1036107374929403904

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="ja" dir="ltr">Metalについての日本語の書籍て中々無かったから有り難い。OpenGLの非推奨を機にMetalを勉強する人に十分にオススメできる。しかも安い<br>Metal入門 | shu223 <a href="https://t.co/IwSxFKW5ey">https://t.co/IwSxFKW5ey</a> <a href="https://twitter.com/hashtag/booth_pm?src=hash&amp;ref_src=twsrc%5Etfw">#booth_pm</a></p>&mdash; モーリー (@cloud_gate0125) <a href="https://twitter.com/cloud_gate0125/status/1008344263178899456?ref_src=twsrc%5Etfw">2018年6月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- https://twitter.com/cloud_gate0125/status/1008344263178899456

## 「iOS 11 Programming」のMetalの章の紹介

iOS 11 Programmingという本にも**Metalについて基礎から解説した章**があります。Metal以外の他のトピックにも興味がある方はこちらの方がいいかもしれません。

- 第1章　iOS 11 概要
- 第2章　ARKit
- 第3章　Core ML
- 第4章　Swift 4の新機能とアップデート
- 第5章　Xcode 9 の新機能
- 第6章　Drag and Drop
- 第7章　FilesとDocument Based Application
- 第8章　レイアウト関連の新機能及び変更点
- 第9章　Core NFC
- 第10章　PDF Kit
- 第11章　SiriKit
- 第12章　HomeKit入門とiOS 11のアップデート
- 第13章　Metal
- 第14章　Audio関連アップデート


PEAKSのサイトにて電子書籍・紙の書籍ともに販売されています。

<div class="peaks_widget" style="overflow:hidden; padding:20px; border:1px solid #dedede;"><div class="peaks_widget__image" style="float:left; margin-right:15px; line-height:0;"><a target="_blank" id="purchase" href="https://peaks.cc/shu223/iOS11"><img alt="iOS 11 Programming" style="border:none; max-width:140px;" src="https://s3-ap-northeast-1.amazonaws.com/peaks-images/project002_cover.jpg" width="500"></a></div><div class="peaks_widget__info"><p style="margin:0 0 3px 0; font-size:110%; font-weight:bold;"><a target="_blank" id="purchase" href="http://peaks.cc/shu223/iOS11">iOS 11 Programming</a></p><ul style="margin:0; padding:0;"><li style="font-size:90%; list-style:none;"><span>著者：</span><span>堤 修一,</span><span>吉田 悠一,</span><span>池田 翔,</span><span>坂田 晃一,</span><span>加藤 尋樹,</span><span>川邉 雄介,</span><span>岸川克己,</span><span>所 友太,</span><span>永野 哲久,</span><span>加藤&#160;寛人,</span></li><li style="font-size:90%; list-style:none;">発行日：2017年11月16日</li><li style="font-size:90%; list-style:none;">対応フォーマット：製本版,PDF</li><li style="font-size:90%; list-style:none;"><a target="_blank" id="purchase" style="text-decoration:underline; color:#1DA1F2;" href="http://peaks.cc/shu223/iOS11">PEAKSで購入する</a></li></ul></div></div>

書籍のタイトルにはiOS 11とありますが、MetalについてはiOS 11で入った新機能の紹介だけではなくて、**基礎からじっくり解説**しています。Metalの章だけで**37ページ**もあります。

[^metalbyexample]: 私も購入しました。2015年に出た書籍なのでサンプルコードが少し古いところもありますが、Metalについてひと通り解説されており、良書だと思います。ただし通読はまだしてなくて、Appleの解説がよくわからないときの副読本的に使用しています。

### 「iOS 11 Programming」のMetalの章の目次

Metalの章の目次です。

- 13.1	はじめに
- 13.2	Metalの概要
- 13.3	Metalの基礎
- 13.4	MetalKit
- 13.5	Metal入門その１ - 画像を描画する
- 13.6	Metal入門その２ - シェーダを利用する
- 13.7	Metal入門その３ - シェーダでテクスチャを描画する
- 13.8	ARKit+Metalその１ - マテリアルをMetalで描画する
- 13.9	ARKit+Metalその２ - MetalによるARKitのカスタムレンダリング
- 13.10	Metal 2
- 13.11	Metalを動作させるためのハードウェア要件

Metalは「画像を描画する」というシンプルなことをやるにも手順が多く、（1年前の僕のような）グラフィックスプログラミング初心者は混乱してしまいがちなので、「Metalの基礎」「入門その１～その３」では、**新しい事項が一気に出てこないよう**、かなり苦労して解説する内容を精査し、順序を考えました。

そして、それでも「新しい概念」はたくさん出てくるので、本書ではそのへんを「なにをやっているのか」「なぜこの手順が必要なのか」ということがわかるように解説して、納得感を得ながら前に進められるようにしています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">堤さんのMetalの章が端的に言って神<br>なぜなんのために置かれているコードなのかわかるようになる</p>&mdash; みつよし (@vespid) <a href="https://twitter.com/vespid/status/927789410522763265?ref_src=twsrc%5Etfw">2017年11月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


後半は、同書の第２章で解説している**ARKitと組み合わせて用いる方法**について、またiOS 11から利用できるようになった**"[Argument Buffers]"**について解説しています。

ちなみにArgument Buffersは、Metal利用アプリケーションのパフォーマンス改善に寄与するMetal 2の新機能です。

- [Argument Buffersを用いたMetalのパフォーマンス改善 - Qiita](https://qiita.com/shu223/items/4fe437698574434b722d)

全体的なおすすめポイントは以下の記事にも書きました。

- [「iOS 11 Programming」を共著で執筆しました／本書のおすすめポイント - Over&Out その後](http://d.hatena.ne.jp/shu223/20171128/1511827476)

他の章も他著やネットではなかなか得られない濃い情報が詰まっているので、気になった方はぜひ[サンプルPDF](http://peaks.cc/shu223/iOS11)もあるので見てみてください。


## おまけ: Metalについて日本語で解説した動画

本書の執筆の真っ最中、iOSDC 2017にてMetalについて「興味ない人向けに」解説したときの動画です。『まったくMetalさわったことないけどわかった』という感想を多くいただきました。

- [iOSDC Japan 2017 09/17 Track B 13:30 / 飛び道具ではないMetal / 堤 修一 - YouTube](https://www.youtube.com/watch?v=USCCR-n0_1E)



<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Metal が一瞬で理解できてきた <a href="https://twitter.com/hashtag/iosdc?src=hash&amp;ref_src=twsrc%5Etfw">#iosdc</a> <a href="https://twitter.com/hashtag/b?src=hash&amp;ref_src=twsrc%5Etfw">#b</a></p>&mdash; kenta.nakai (@urouro_n) <a href="https://twitter.com/urouro_n/status/909276946160246784?ref_src=twsrc%5Etfw">2017年9月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">堤さんのトークでMetalがだいぶ身近になった！ちゃんと勉強してみたい <a href="https://twitter.com/hashtag/iosdc?src=hash&amp;ref_src=twsrc%5Etfw">#iosdc</a> <a href="https://twitter.com/hashtag/b?src=hash&amp;ref_src=twsrc%5Etfw">#b</a></p>&mdash; Yuichi Kobayashi (@imk2o) <a href="https://twitter.com/imk2o/status/909278742526095360?ref_src=twsrc%5Etfw">2017年9月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Metal簡単なのではという気持ちになってきた <a href="https://twitter.com/hashtag/iosdc?src=hash&amp;ref_src=twsrc%5Etfw">#iosdc</a> <a href="https://twitter.com/hashtag/b?src=hash&amp;ref_src=twsrc%5Etfw">#b</a></p>&mdash; setoh (@seto_hi) <a href="https://twitter.com/seto_hi/status/909277284229459968?ref_src=twsrc%5Etfw">2017年9月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>