iOS/macOSのGPUインターフェースMetalの入門書を書きました。その名も「Metal入門」です。4月22日に開催される技術書の同人誌イベント、技術書典4向けに書いたもので、初めて出版社を通さず個人で書いた書籍になります。ちなみに日本語としては初のMetal解説書1でもあります。
本の詳細
A5版(技術評論社の実践入門シリーズのサイズ)で全128ページ。一時150ページに達したのですがどうにかこうにか切り詰めてここまで収めたので、ギュッと詰まってます。小さくて(普通の技術書よりは)薄いので、カバンに入れておいても邪魔にならないサイズです。
ちなみに「GPUと戯れてみたいけどまずはほんのさわりでいい」という方のために、全48ページの「普及版」も用意しております。
GPUを操ることに興味のある方、GPUの気持ちをもっとわかりたい方はぜひ!
価格
無料サンプル
まえがき・目次・各章のさわりを試し読みできる無料サンプルをこちらからダウンロードしていただけます!
通常版
(製本仕様)128ページ/平綴じ/マットPP
- 製本版のみ: 1200円(会場限定・・・の予定)
- 電子版のみ: 1200円(4/25以降は1500円)
- 電子版とのセット: 1500円(会場限定)
普及版
(製本仕様)48ページ/中綴じ/表紙なし
- 製本版のみ: 500円(会場限定の予定)
- 電子版のみ: 検討中
- 電子版(通常版※)とのセット: 検討中
- ※普及版の電子書籍版は作成しない予定です
目次
- はじめに
- 第1章 Metal の概要
- 1.1 Metal とは
- 1.2 Metal の用途
- UIKitでもMetalが利用されている
- 増え続けるMetal関連機能
- 1.3 Metal を構成するフレームワーク群とシェーディング言語
- 第2章 Metal の基礎
- 2.1 Metalの「最初のハードル」
- 2.2 「背景にある概念」を理解する
- 2.3 Metalの基本クラスとプロトコル
MTLDevice
MTLCommandBuffer
MTLCommandQueue
MTLCommandEncoder
MTLBuffer,MTLTexture
- 2.4 MetalKit
MTKView
MTKViewDelegate
MTKTextureLoader
- 第3章 入門その1 - 画像を描画する
- 3.1 描画処理のためのセットアップを行う
- 3.2 画像をテクスチャとしてロードする
- 3.3 描画処理を実行する
- ドローアブル
- MTKViewのcurrentDrawable
- ブリットコマンドエンコーダ
- 描画処理の全体
- 第4章 入門その2 - シェーダを利用する
- 4.1 Metalシェーダの基礎
- シェーダとは
- MetalShadingLanguage(MSL)
- Metal シェーダファイルと Metal ライブラリファイル
MTLLibrary
とMTLFunction
- 4.2 「画面全体を一色に塗る」シェーダの実装
- 1.Metalシェーダファイルの作成
- 2.頂点シェーダ関数の実装
- 3.フラグメントシェーダ関数の実装
- 4.3 CPUプログラム側の実装
- シェーダにデータを渡すためのバッファを準備する
- レンダリングパイプラインを用意する
MTLRenderPipelineState
の生成タイミング- レンダリングコマンドをエンコードする
- 4.1 Metalシェーダの基礎
- 第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の実装例 - パススルーコンピュートシェーダ - CPUプログラム側の実装
- 第8章 MSL 入門
- 8.1 Metal のグラフィックスレンダリングパイプライン
- 8.2 .metalファイルと.metallibファイル - デフォルトライブラリ - コマンドラインユーティリティを用いた Metal ライブラリのビルド
- 実行時にMSLをコンパイルする
- 8.3 FunctionQualifier(関数修飾子)
- 8.4 AttributeQualifier(属性修飾子)
[[position]]
[[vertex_id]]
[[stage_in]]
[[buffer(n)]]
[[texture(n)]]
[[sampler(n)]]
[[threadpositionin_grid]]
[[threadgrouppositioningrid]]
,[[ threadsper_threadgroup ]]
- 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 画像の転置(行と列の入れ替え)
- 9.1 デバイスがMPSをサポートしているかを確認する - 9.2 ガウシアンブラー - 9.3
- 第10章 Metal の最適化
- 10.1 スレッドグループサイズの最適化
- スレッドグループサイズの決定方法 - 不均一スレッドグループサイズを利用して最適化する - 10.2 ArgumentBuffers
- ArgumentBuffersの概要 - ArgumentBuffersの実装 - 第 11 章 Metal のデバッグ
- 11.1 GPUフレームキャプチャを有効にする
- 11.2 Xcode上でGPUの負荷を確認する
- 11.3 GPUフレームデバッガ
- シェーダにバインドされているリソースの一覧を見る
- パイプラインの統計情報
- パフォーマンス改善のヒント
- issueを見る
- シェーダの処理毎のパフォーマンス確認
- 11.4 GPUフレームキャプチャをプログラムから制御
- 11.5 InstrumentsのMetalSystemTrace
- 11.6 ラベル
- 11.7 デバッググループ
- 11.8 GPUで利用中のメモリサイズを調べる
- 10.1 スレッドグループサイズの最適化
- 第 12 章 Core Image× Metal
- 12.1 Core ImageとMetalのシームレスな統合
- 12.2 Core Imageのフィルタ結果をMetalで描画する
- Metalによる
CIImage
のレンダリング - 実装例
- Metalによる
- 12.3 CoreImageのカスタムフィルタをMetalで書く
- Metalでカーネルを書く利点
- MSLによるカスタムカーネルの実装
- Metalカスタムカーネルを利用するためのビルド設定
第 13 章 SceneKit × Metal
- 13.1 Metal で SceneKit のマテリアルを描画する
SCNProgram
の実装SCNProgram
で利用するシェーダの実装SCNProgram
で用いるシェーダに値を渡す
- 13.2 他のSceneKitとMetalの連携機能
SCNTechnique
shaderModifiers
SCNRenderer
- 13.1 Metal で SceneKit のマテリアルを描画する
第14章 ARKit × Metal
- 14.1 マテリアルをMetalで描画する
- 14.2 MetalによるARKitのカスタムレンダリング
- 第15章 Core Video × Metal
- 15.1 Metalでリアルタイム動画処理
CVImageBuffer
からMTLTexture
を作成する -CIContext
を利用CVImageBuffer
からMTLTexture
を作成する -CVMetalTextureCache
を利用
- 15.1 Metalでリアルタイム動画処理
余談:技術書典で本を出す理由
僕はフリーランスエンジニアでして、1日n万円の単価でお客さんに技術力を提供して生計を立てております。ありがたいことに今のところは食べていけております。
しかしお客さん仕事は基本的に「僕がプロとして間違いなく貢献できる領域」についてご依頼いただけるものなので、それだけでスケジュールを埋めてしまうと、
- 仕事で必要なわけではないが単に興味がある
- 今は素人だけど学んでいきたい
というような、「今は仕事になってない技術」を開拓していく時間が減ってしまいます。
なので理想的にはスケジュールをびっちり埋めずに、興味のある技術を勉強したり、それを発信したり、オープンソースで公開したり、という時間を確保したいという気持ちはあるのですが、まぁでもお客さんの仕事もおもしろいし勉強になるし、お金ももらえるし・・・ということでどうしても仕事で埋めてしまいがちです。
そこでよく思うのが、技術の勉強自体をマネタイズできれば、「既にスキルがあって、稼げる」フリーの仕事とバランスとってやれるようになるのになぁ、ということです。興味があってしかも稼げるなら、単純に天秤にかけるときに重みがかかる。
幸運にも、「興味のある技術を勉強しては発信してたらお仕事につながった」という例も過去にはあります(BLEとか)。しかしブログやOSSを見て仕事の依頼をいただける、というのは自分ではコントロールできないので(要は「たまたま」なので)その結果をあらかじめ織り込むことはできない。やっぱり技術情報発信そのものでマネタイズできたら理想的だなと。実際に可能かどうかは別にして、手段は探っていきたい。
その手段の候補のひとつが個人での書籍の出版です。出版社を通してちゃんとした技術書を出すのはめちゃめちゃ大変だしあまり収入にもなりませんが、個人で出すならもっとライトに出せるんじゃないの、と。ページ数が230ページ以上じゃないといけない、ということもないし、技術書っていうジャンルはプロによる超美しい装丁じゃなくてもいいと思うし、売れなそうな企画でも自分さえやりたければGOできる。
これである程度収益になるとしたら、
勉強→ブログ→ある程度たまったら本
というサイクルができたらいいな、と。そういうサイクルをまわしているうちにランダムイベントとしての「お仕事の依頼」もあるかもしれない。
で、そんなことを思い続けて案の定一文字も書くことなく4年程経ち、そこに技術書典という超素晴らしいイベントが出てきたので乗っからせていただいた次第です2。たとえあんまり売れなくても、今回技術書典ドリブンでついに個人で本を書き上げることができたというだけでも、自分的にはかなりの達成感があります。
まとめ
余談が長くなってしまいましたが、つまりいろいろ思うところがあり個人で本を書いて技術書典で販売することになりました!
Swinjectの多賀谷さんと共同ブースです(執筆はそれぞれ)。
4月22日、「き04」でお待ちしております!
章単位でいえば、PEAKS社刊行「iOS 11 Programming」のMetalの章(私が執筆)が初となります↩