OpenGLは、高速に3D空間を描画するためのマルチプラットフォームなライブラリです。高速に動作することや、使用メモリの量を低減できるといった特徴により、ゲームやモバイル向けのアプリケーションなどに利用されています。
本書は組み込み用途に特化したOpenGL ESを使い、Android端末をターゲットプラットフォームとして2Dや3Dの基礎から応用的な3Dプログラムの開発までを解説します。モバイル向けのアプリケーション開発でOpenGL ESを使いこなすための実践的なポイントやコツを提供し、3Dプログラミングを始めるために必要な知識とテクニックを効率よく学べる入門書です。
初めてのOpenGL ES
山下 武志 著
- TOPICS
- Programming
- 発行年月日
- 2011年07月
- PRINT LENGTH
- 270
- ISBN
- 978-4-87311-496-5
- FORMAT
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
第1刷に対する正誤表
■P29 上から2段落め。補足内容を修正 誤: 第 3 引数には頂点同士の隙間のバイト数を指定します。頂点の XYZ の情報を読み込んだ後、OpenGL ES は第 3 引数のバイト数分だけ読 み込みをスキップします。これはあまり使う機会はないかもしれませ んが、例えば位置・色・UV 等、頂点を構成するすべての情報を1つの Bufferにまとめた場合などに利用します。難しく考えたくない場合は、 常に 0 を指定すれば問題ありません(筆者は 0 以外の値を指定する ことは極めて稀です)。 正: 第 3 引数には頂点同士の隙間のバイト数を指定します。頂点の XYZ の情報を読み込んだ後、OpenGL ES は第 3 引数のバイト数分だけ読 み込み位置をスキップします。例えば位置・色・UV 等、頂点を構成 するすべての情報を1つのBufferにまとめた場合などに利用します。 難しく考えたくない場合は、常に 0 を指定すれば問題ありません。 Bufferをまとめる・まとめないのメリットやその感じ方はそれぞれで すから、どちらかに固執せずに必要に応じて切り替えるとよいでしょう。 ■P40 図4-2と図4-3 図4-2と図4-3のそれぞれ右側のイメージ(読み込ませた場合のイメージ) が逆になっているため、入れ替え。 ■P45 上から7行目 誤: ...第3引数にはpnameを指定します。この値は... 正: ...第3引数にはparamを指定します。この値は... ■P64 一番上の行列の図 誤: (1 0 0 1) (0 1 0 0) (0 0 1 0) (X移動量 Y移動量 Z移動量 1) 正: 誤: (1 0 0 0) (0 1 0 0) (0 0 1 0) (X移動量 Y移動量 Z移動量 1) ■P64 一番下の行列の図 誤: (0 1 2 1) × (1 1 1 1) (1 1 1 1) (1 1 1 1) (0 0 0 0) 正: (0 1 2 1) × (1 0 0 0) (0 1 0 0) (0 0 1 0) (1 2 3 1) ■P65 一番上の行列の図(図6-1) ※一番右下はw×0ではなく、w×1が正しい数値です。 誤: ( x×1 x×0 x×0 x×0 ) ( y×0 y×1 y×0 y×0 ) ( z×0 z×0 z×1 z×0 ) ( w×1 w×2 w×3 w×0 ) 正: ( x×1 x×0 x×0 x×0 ) ( y×0 y×1 y×0 y×0 ) ( z×0 z×0 z×1 z×0 ) ( w×1 w×2 w×3 w×1 ) ■P105 上から5行目 誤: 逆に3Dではデザイナが作成した複雑な... 正: 逆に3Dではグラフィッカが作成した複雑な...
目次
目次 本書に寄せて はじめに 1部 2DとしてOpenGL ESを扱う 1章 OpenGL ESとAndroid 1.1 OpenGLとは何なのか? 1.2 OpenGL ESのバージョン 1.2.1 Androidの対応バージョン 1.3 OpenGL ESで利用するデータ型 2章 Hello OpenGL ES! 2.1 プロジェクトのセットアップ 2.1.1 SDKのインストール 2.1.2 プロジェクト作成 2.1.3 描画用SurfaceViewを追加する 2.2 画面のどこを使うのか? 2.2.1 画面を塗りつぶす 2.2.2 GLSurfaceViewの制限 3章 簡単な図形を描画する 3.1 正規化されたデバイス座標系の存在 3.2 バイトオーダーの問題とjava.nioの存在 3.3 OpenGL ESへの関連付けと描画 3.3.1 頂点を使いまわすことによる最適化 3.3.2 トライアングルストリップの活用 3.4 任意座標への描画 3.5 任意の色での描画 4章 画像を描画する 4.1 テクスチャ、U、Vという存在 4.2 テクスチャの制限 4.3 テクスチャを読み込む 4.4 頂点のUV座標を指定する 4.5 テクスチャの指定領域を利用する 4.6 文字を描画する 4.7 複数枚のテクスチャを扱う 5章 画像をブレンドする 5.1 ブレンディングという要素 5.2 アルファブレンディング 5.2.1 ブレンド計算を理解する 2部 メモリの効率化と速度向上のために 6章 行列のできるOpenGL 6.1 行列とは? 6.1.1 移動行列 6.1.2 拡大縮小行列 6.1.3 回転行列 6.2 行列を乗算する際の注意点 6.3 OpenGL ESで行列を操作する 6.3.1 行列の適用順序 6.4 行列を利用して任意の四角形を描画する 6.5 行列でUV座標を操作する 7章 VertexBufferObjectで描画速度を向上する 7.1 VertexBufferObjectとは? 7.2 VBO利用の流れ 7.3 UVバッファをVBOで利用する 7.4 1つのVBOに頂点情報をまとめる 3部 3Dの基本 8章 カメラの概念 8.1 現実をコンピュータ上に置き換えるということ 8.1.1 gluPerspective関数 9章 インデックスバッファの存在 9.1 インデックスバッファの必要性 9.2 「頂点」と「ポリゴン」の分離 9.3 インデックスバッファの利用 9.4 インデックスバッファの利用例 9.4.1 TRIANGLE_STRIPを利用してインデックスバッファを複数個 用意した場合(例1) 9.4.2 TRIANGLE_STRIPを利用してインデックスバッファを1つ 用意した場合(例2) 9.4.3 TRIANGLESによる正六面体描画(例3) 9.5 インデックスバッファのVBO 10章 本格的に3Dを扱う 10.1 「ローカル座標」と「ワールド座標」の考え方 10.2 正六面体を複数描画する 10.3 Zバッファの存在 10.2.1 Zファイティングの存在 10.2.2 指定位置に描画するための行列 11章 さらに本格的に3Dを利用する 11.1 2Dと3Dを共存する 4部 3D知識の応用 12章 応用的な3D知識 12.1 ライトとマテリアル 12.2 3Dプログラムにおけるライトとは? 12.3 3Dプログラムにおけるマテリアルとは? 12.3.1 頂点の向きを考える 12.3.2 ライトの情報を変更する 12.4 マテリアルの設定 13章 フォグによる遠近の演出 13.1 フォグを使ってみる 13.1.1 リニア方式でフォグを指定する 13.2 ポイントスプライトの活用 13.3 ポリゴンの表と裏 5部 実践編 14章 実際のツールと連携する 14.1 3DCG用ツールについて 14.2 3DCG用ツールとは? 14.3 モデルを構成する要素 14.3.1 Metasequoia形式からOpenGL ESへの読み込み 14.4 OpenGL ESへの転送 14.5 画面内にモデルを表示する 15章 より実践的にOpenGL ESを利用する 15.1 「アルファテスト」を利用する 15.2 「ポリゴンの反転」を利用する 15.3 おわりに 付録A 圧縮テクスチャを利用する A.1 圧縮テクスチャとは? A.1.1 無圧縮テクスチャについて A.2 圧縮テクスチャの例 A.3 256色BitmapをAndroidで直接読み込む A.4 256色パレットテクスチャを生成する 付録B GLSurfaceViewから脱却する B.1 GLSurfaceViiewの問題点とその改善 B.1.1 SurfaceViewの準備 B.1.2 SurfaceHolderのコールバックを待つ B.2 描画用メソッドの実装 B.3 休止・復帰処理の追加 付録C ライブ壁紙でOpenGL ESを利用する C.1 ライブ壁紙とは? C.2 ライブ壁紙を作成する C.2.1 EngineがOSから受け取るメッセージ C.3 XMLの編集 索引