iPhone 3Dプログラミング
――OpenGL ESによるアプリケーション開発

[cover photo]
  • 2011年03月 発行
  • 464ページ
  • ISBN978-4-87311-484-2
  • フォーマット Print PDF
  • 原書: iPhone 3D Programming

オライリー・ジャパンで書籍を購入:
定価4,104円

Ebook Storeで電子版を購入:
価格3,283円

OpenGL ESを段階的に学ぶことができるiPhone対応3Dアプリケーション開発についての解説書。3Dビューワ、ARアプリケーション、物理シミュレーションなどのサンプルを使って、頂点バッファ、ライティング、テクスチャ、シェーダといった3Dの基本から、タッチスクリーン、コンパス、センサーといったiPhone特有の機能、そして最適化までiPhone 3Dプログラミングを体系的に解説します。日本語版では人気のARアプリ「セカイカメラ」で使われている最適化手法など開発現場で役に立つ実践的なテクニックやOpenGL ESの拡張命令一覧を巻末付録として収録しました。OpenGL ES 1.1/2.0対応。

翻訳者によるサポートページ(本書のサンプルコードをダウンロード可)。

関連書籍

Androidアプリケーション開発ガイド
iOS SDK Hacks
iPhone SDK アプリケーション開発ガイド
iPhone/iPadゲーム開発ガイド
iPhoneアプリケーション開発ガイド
詳解 OpenCV
実例で学ぶゲーム3D数学

目次
監訳者まえがき
推薦の言葉
まえがき

1章 クイックスタートガイド
    1.1 Apple環境への移行
        1.1.1 Objective-C
    1.2 OpenGL ES小史
    1.3 OpenGL ESの適切なバージョンの選択
    1.4 作業開始
        1.4.1 iOS SDKのインストール
        1.4.2 Xcodeを使用した OpenGLテンプレートアプリケーションの作成
        1.4.3 iPhone実機へのインストール
    1.5 固定機能を使った HelloArrow
        1.5.1 3Dアプリケーションのレイヤ構成
        1.5.2 ゼロからの出発
        1.5.3 OpenGLとQuartzライブラリのリンク
        1.5.4 UIViewのサブクラス作成
        1.5.5 アプリケーションデリゲートの利用
        1.5.6 アイコンと起動時画面イメージのセットアップ
        1.5.7 ステータスバーの扱い
        1.5.8 レンダリングエンジンのインタフェースの定義と使用
        1.5.9 レンダリングエンジンの実装
        1.5.10 機器の向きの処理
        1.5.11 回転のアニメーション化
    1.6 シェーダを使った HelloArrow
        1.6.1 シェーダ
        1.6.2 フレームワーク
        1.6.3 GLView
        1.6.4 RenderingEngineの実装
    1.7 まとめ

2章 3DCGのための数学
    2.1 組み立てラインとのアナロジー
    2.2 頂点によるプリミティブの構成
    2.3 頂点へのプロパティの付与
    2.4 頂点のライフスパン
    2.5 写真とのアナロジー
        2.5.1 モデル行列の設定
        2.5.2 視野変換の設定
        2.5.3 投影変換の設定
    2.6 行列スタックを使った変換行列の保存と復帰
    2.7 アニメーション
        2.7.1 補間技法
        2.7.2 四元数(クォータニオン)による回転アニメーション
    2.8 C++を使ったベクトル式の整形
    2.9 固定機能を使った HelloCone
        2.9.1 RenderingEngineの宣言
        2.9.2 OpenGLの初期化と円錐のテッセレーション
        2.9.3 3次元での滑らかな回転
        2.9.4 メソッド Render
    2.10 シェーダを使った HelloCone
    2.11 まとめ

3章 頂点とタッチポイント
    3.1 タッチスクリーンの読み出し
    3.2 頂点インデックスによるメモリの節約
    3.3 頂点バッファオブジェクトによるパフォーマンス向上
    3.4 ワイヤーフレームビューアの作成
        3.4.1 パラメトリック曲面で遊ぶ
        3.4.2 インタフェースの設計
        3.4.3 トラックボール回転の取り扱い
        3.4.4 レンダリングエンジンの実装
        3.4.5 簡易タブバー
        3.4.6 トランジションのアニメーション化
    3.5 まとめ

4章 照明効果とシェーディング
    4.1 デプスバッファの検討
        4.1.1 デプスアーティファクト( Zファイティング)
    4.2 デプスバッファの作成法と使用法
    4.3 ワイヤーフレームの三角形による充填
    4.4 表面法線ベクトル
        4.4.1 OpenGLへの法線ベクトルの供給
        4.4.2 法線の数学
        4.4.3 座標変換と法線ベクトル
        4.4.4 パラメトリック曲面の法線ベクトル生成
    4.5 照明
        4.5.1 つまらない環境光
        4.5.2 拡散光による光沢のない彩色
        4.5.3 鏡面反射光を用いた輝き
        4.5.4 ModelViewerへの照明の追加
        4.5.5 照明属性の利用
    4.6 シェーダ詳解
    4.7 ModelViewerへのシェーダの追加
        4.7.1 新しいレンダリングエンジン
        4.7.2 ピクセル単位の照明
        4.7.3 トゥーンシェーディング
    4.8 ポリゴンオフセットを使ったワイヤーフレームの改良
    4.9 OBJファイルからのジオメトリの読み込み
        4.9.1 リソースファイルの取り扱い
        4.9.2 ISurfaceの実装
    4.10 まとめ

5章 テクスチャと画像キャプチャ
    5.1 ModelViewerへのテクスチャ追加
        5.1.1 IResourceManagerの機能強化
        5.1.2 テクスチャ座標の生成
        5.1.3 ES1::RenderingEngineでのテクスチャ有効化
        5.1.4 ES2::RenderingEngineでのテクスチャ有効化
    5.2 テクスチャ座標再考
    5.3 フィルタリングによるアンチエイリアスへの対処
        5.3.1 ミップマップ利用による画質とパフォーマンスの向上
        5.3.2 ModelViewerへのミップマップ対応の組み込み
    5.4 テクスチャのフォーマットとデータ型
        5.4.1 実践:さまざまなフォーマットの読み込み
    5.5 PVRTCによるテクスチャ圧縮
    5.6 PowerVRSDKと低解像度テクスチャ
    5.7 Quartzによる OpenGLテクスチャの生成と変形
    5.8 サイズの制限への対処
        5.8.1 POTへの変換
    5.9 カメラを使ったテクスチャ作成
        5.9.1 CameraTextureのレンダリングエンジン実装
    5.10 まとめ

6章 ブレンディングと拡張現実
    6.1 ブレンディングのレシピ
    6.2 アルファ値の取り扱い
    6.3 ブレンディングの注意事項
    6.4 ブレンディングの拡張機能とその用法
        6.4.1 多様なブレンディング設定の有用性
    6.5 テクスチャ色と頂点色
    6.6 ステンシルバッファによる簡易反射像
        6.6.1 円盤のステンシルのみへの描画
        6.6.2 ステンシルテストを使った反射像の描画
        6.6.3 「本当の」物体の描画
        6.6.4 前から後ろへのブレンディングによる円盤の描画
    6.7 旧型 iPhoneのためのステンシルの代替手段
    6.8 オフスクリーン FBOを使ったアンチエイリアス技法
        6.8.1 スーパーサンプリングのスーパーシンプルなサンプルアプリ
        6.8.2 ジッタ効果
        6.8.3 その他の FBOエフェクト
    6.9 アンチエイリアスされた線のテクスチャによる描画
    6.10 サンプルプログラム Holodeck
        6.10.1 アプリケーションの雛形
        6.10.2 ドーム、雲、文字列のレンダリング
        6.10.3 ヘッドアップディスプレイの描画
        6.10.4 ボタンとセンサーの置き換え
    6.11 まとめ

7章 スプライトと文字列
    7.1 文字列レンダリング入門── FPSカウンタの表示
        7.1.1 Pythonを使ったグリフテクスチャの生成
        7.1.2 FPS表示のレンダリング
    7.2 glDrawTexOESによる簡素化
    7.3 距離場を使ったきれいな文字
        7.3.1 Pythonによる距離場の生成
        7.3.2 ES 1.1での距離場とアルファテストの併用
        7.3.3 フラグメントシェーダを使った文字飾り
        7.3.4 スムージングと微分係数
        7.3.5 アウトライン、グロー、シャドウ効果の実装
    7.4 スプライトシートを使ったアニメーション
    7.5 画像合成とマルチテクスチャ
    7.6 OpenGL ESとUIKitの混在
    7.7 紙吹雪、花火、その他の描画──ポイントスプライト
    7.8 この章のフィナーレ── SpringyStars
        7.8.1 物理学への寄り道──バネ質量系
        7.8.2 C++インタフェースと GLView
        7.8.3 アプリケーションエンジンの実装
        7.8.4 OpenGL ES 1.1レンダリングエンジンと加算ブレンディング
        7.8.5 OpenGL ES 2.0のポイントスプライト
    7.9 まとめ

8章 高度な照明効果とテクスチャ技法
    8.1 OpenGL ES 1.1のテクスチャ環境
        8.1.1 テクスチャコンバイナ
    8.2 バンプマッピングと DOT3ライティング
        8.2.1 線形代数再論
        8.2.2 基底ベクトルの生成
        8.2.3 OpenGL ES 2.0による法線マッピング
        8.2.4 OpenGL ES 1.1による法線マッピング
        8.2.5 オブジェクト空間の法線マップの生成
    8.3 キューブマップを用いた反射の表現
        8.3.1 キューブマップへのレンダリング
    8.4 異方性フィルタ ─強化版テクスチャ
    8.5 画像処理の例──ブルーム効果
        8.5.1 ハイブリッド法によるパフォーマンスの改善
        8.5.2 ガウスフィルタによるブルーム効果のサンプルコード
    8.6 まとめ

9章 最適化
    9.1 最適化のツール「 Instruments」
    9.2 ボトルネックの切り分け── CPUとGPU
    9.3 頂点データの引き渡し── VBOを超えて
        9.3.1 バッチ、バッチ、バッチ
        9.3.2 インタリーブされた頂点属性
        9.3.3 頂点データフォーマットの最適化
        9.3.4 最適なトポロジーとインデックスの使用
    9.4 照明の最適化
        9.4.1 オブジェクト空間での照明
        9.4.2 DOT3ライティングの再検討
        9.4.3 照明効果の焼き付け
    9.5 テクスチャの最適化
    9.6 カリングとクリッピング
        9.6.1 ポリゴンワインディング
        9.6.2 ユーザークリッピング平面
        9.6.3 CPUベースのクリッピング
    9.7 シェーダのパフォーマンス
        9.7.1 条件分岐
        9.7.2 フラグメント処理の中止
        9.7.3 テクスチャの参照は要注意
    9.8 頂点スキニングによるアニメーションの最適化
        9.8.1 スキニング──共通コード
        9.8.2 OpenGL ES 2.0でのスキニング
        9.8.3 OpenGL ES 1.1でのスキニング
        9.8.4 ブレンド加重値とインデックスの生成
        9.8.5 ピンチングに要注意
    9.9 参考文献

付録 A C++ベクトルライブラリ
    A.1 パフォーマンスに関する注意点
    A.2 Vector.hpp
    A.3 Matrix.hpp
    A.4 Quaternion.hpp

付録 B プロが使う最適化テクニック
    B.1 ハードウェアをよく知る: OpenGL ES拡張命令
        B.1.1 実機とシミュレータとの違い
        B.1.2 OpenGL ESの拡張命令
    B.2 マルチプラットフォームを考慮した作り方
    B.3 より高精細な画質を求めて:フルシーンアンチエイリアシング
    B.4 サイズを小さくする:アプリ容量チューニング
    B.5 低消費電力:バッテリーに優しいアプリ
    B.6 テクスチャ圧縮方式の詳細
        B.6.1 PVRTC(Power VR Texture Compression)
    B.7 リソース紹介
        B.7.1 フレームワーク
        B.7.2 ツール
        B.7.3 資料

付録 C 経験則による最適化テクニック
    C.1 大量の 3Dスプライト描画における最適化
        C.1.1 重なり合ってアニメーションする半透明のオブジェクト
        C.1.2 複数の独立した 3Dスプライトをつなげる
        C.1.3 テクスチャを 1つにまとめる
    C.2 インデックスカラーのテクスチャ
    C.3 描画クオリティとパフォーマンス
    C.4 アニメーションのフレーム間の時間差分
    C.5 複数のコンテキスト間でのオブジェクトの共有
    C.6 透明度の異なるオブジェクトとカメラプレビューとのブレンド
    C.7 iOSとAndroid

索引

コラム目次
    オプション──何もないテンプレートの作成
    Objective-Cにおけるメモリ管理
    コーディング規約
    複数行にわたる文字列
    同次座標(斉次座標)
    OpenGL関数の接尾子
    STL──使うべきか使わざるべきか
    フラットシェーディング
    仕様によれば
    サンプリングされるレベルの調整
    機能拡張文字列を読みやすく
    アルファテスト
    一般的な OpenGLエラー
    Pythonモジュールのインストール
    肌理(きめ)の表現にも使われる異方性

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]