Software Design plusシリーズGPU 並列図形処理入門
――CUDAOpenGLの導入と活用

書籍の概要

この本の概要

2Dや3Dなどのコンピュータ画像処理を担うGPU(Graphic Processing Unit)は性能向上が著しく,その処理能力を活かすためのソフトウェア開発が求められています。GPUはCPUと異なり並列処理機能に秀でており,複雑な図形計算を高速処理できるからです。本書はGPUによる並列処理機能を軸に,nVIDIA社のCUDA(Compute Unified Device Architecture)の利用方法とOpenGLのプログラミング方法を基礎の基礎から解説します。コンピュータグラフィックスのプログラミングを実践するための理論を学べます。C言語の知識は必須です。

こんな方におすすめ

  • OpenGL、CUDAを利用したプログラミングの基礎を学びたい方に

著者の一言

本書の執筆にあたっては多くの方々にご支援いただいた。まず著者に出版の機会をご紹介いただいた(株)タイムインターメディア社の藤原博文氏と,執筆中に様々な形でサポートいただいた(株)技術評論社の池本公平氏に感謝したい。また粒子法と拡散方程式の説明において,著作からの例題の利用をお許しいただいた東京工業大学の青木尊之教授と(株)工学社の白鳥達哉氏にも心から感謝したい。さらに序章の図版と,メタボール法及びマーチングキューブ法の説明においてアルゴリズム利用を許諾いただいたNVIDIA Japanにも心から感謝する。本書で取り上げたプログラムのいくつかは,著者が茨城大学で研究してきた成果がベースになっている。かつて研究室に在籍した多くの大学院生,とりわけ垣尾良輔君と長谷川裕二君に感謝したい。
著者は,1999年にGPU(当時はまだGeometry Engineと呼ばれていた)を用いて図形計算を高速化するアイデアを発案し,それらを特許出願する機会を得た。この特許は我が国の様々な企業でものづくりに活用されている。特許出願の機会を与えてくれた独立行政法人科学技術振興事業団(現,事業機構)と,特許を実用に結びつけてくれた企業の多くの技術者の方々に深く感謝したい。特許出願や実用化の過程での経験は,その全てが著者の研究において大きな資産となっている。厳しい状況の中,優れた研究環境実現のために努力を続けている茨城大学工学部の方々,とりわけいつもご支援いただいている知能システム工学科の梅津信幸講師と事務補佐員の皆さんにも心から感謝したい。
本書の執筆は,2年ほど前にGPUを用いた並列図形処理の例題を集めることからスタートした。以後,帰宅後や週末のかなりの時間を,プログラミングと本書の執筆に割いてきた。帰宅しても自室でPCに向かってばかりの著者を温かく(時には厳しく)励ましてくれた妻と子供たちには言葉で表しきれないほど感謝している。ページ数の制約もあり,立体モデルのボクセル化,断面図生成,距離場計算,厚み評価,接近可能性解析,集合演算など,多くの例題を本書から外すことになってしまった。もし機会があれば,これらを解説する本書の続編を執筆したいと考えている。
最後に,著者が研究者の道を歩むことをいつも応援してくれている父と母に心から感謝したい。中学生時代に買ってもらった高橋製作所の天体望遠鏡が,私の研究者人生の出発点になった。今も手元にある望遠鏡で星空を眺めながら,豊かで平和な時代に研究を続けられることの幸せを心から感じている。

補足その他

補足情報ページより,本書掲載のサンプルソースコードがダウンロードできるようになっています。本書を読み進めるにあたりぜひご利用ください。

本書のサンプル

本書の一部ページを,PDFで確認することができます。

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

目次

第1部 コンピュータグラフィックスの基礎
第1章 プログラミングの準備

  • 1.1 Visual
    • 1.1.1 コンソールアプリケーションの作成
    • 1.1.2 設定の変更
  • 1.2 glutとOpenGLの利用6
  • 1.3 freeglutのインストール
  • 1.4 freeglutを利用したプログラミング

第2章 OpenGLとglutを用いた2次元コンピュータグラフィックス

  • 2.1 2次元コンピュータグラフィックスのプログラミング
    • 2.1.1 図形の指示
    • 2.1.2 座標の指示
    • 2.1.3 図形の色付け
  • 2.2 座標の投影とビューポート変換
    • 2.2.1 正投影の導入による表示範囲の拡大
    • 2.2.2 ウィンドウとビューポート変換
    • 2.2.3 アスペクト比の変更
    • 2.2.4 図形中心の表示

第3章 3次元コンピュータグラフィックスへの拡張

  • 3.1 正投影31
    • 3.1.1 視点の変更
    • 3.1.2 視体積の範囲決め
    • 3.1.3 方位角と仰角の利用
    • 3.1.4 マウス操作による視点の変更
  • 3.2 ポリゴンの描画
    • 3.2.1 隠面消去
    • 3.2.2 シェーディング

第2部 OpenGLを用いた並列図形処理 55
第4章 ボロノイ図の生成

  • 4.1 ボロノイ図とは
  • 4.2 ボロノイ図の画像生成
  • 4.3 実装の準備
  • 4.4 円錐形状の描画
  • 4.5 画像の取得と利用.70

第5章 オフセット面の生成

  • 5.1 デプスバッファを用いたオフセット面の計算
  • 5.2 STLフォーマット
  • 5.3 STLファイルの読み込み用関数
  • 5.4 ポリゴンモデルの表示用関数
  • 5.5 オフセットプログラムの準備
  • 5.6 オフセット処理の実現
    • 5.6.1 球,円筒形,スラブ形状の描画
    • 5.6.2 オフセット面の取得
    • 5.6.3 オフセット面の描画
  • 5.7 プログラムの完成

第3部 CUDAの導入とOpenGLとの併用
第6章 CUDAの導入

  • 6.1 CUDAのインストール
  • 6.2 Visual StudioによるCUDAプログラムの開発
  • 6.3 CUDA処理の基本的な考え方
    • 6.3.1 典型的な処理の流れ
    • 6.3.2 GPUの並列処理アーキテクチャ
    • 6.3.3 スレッドによる並列処理
    • 6.3.4 ブロックとグリッド
  • 6.4 CUDA関数の紹介
    • 6.4.1 メモリ管理
    • 6.4.2 データ転送
    • 6.4.3 ブロックとグリッドの定義
    • 6.4.4 カーネル関数
    • 6.4.5 デバイス関数
  • 6.5 プログラム例
    • 6.5.1 CPU処理の実装例
    • 6.5.2 CUDAによる実装
    • 6.5.3 シェアードメモリの利用

第7章 粒子法解析とアニメーション表示

  • 7.1 粒子法解析
  • 7.2 粒子法解析アルゴリズムの実装
    • 7.2.1 CPU処理による実装
    • 7.2.2 GPU処理による実装
  • 7.3 VBOの導入
    • 7.3.1 VBOを用いた図形描画
    • 7.3.2 VBOによる粒子群の表示154
  • 7.4 CUDAとVBOの併用

第8章 拡散方程式の数値解法とアニメーション表示

  • 8.1 差分法による拡散方程式の数値解法
  • 8.2 差分法アルゴリズムの実装
    • 8.2.1 CPU処理による実装
    • 8.2.2 GPU処理による実装
    • 8.2.3 シェアードメモリの利用
    • 8.2.4 テクスチャメモリの利用
  • 8.3 PBOの導入

第4部 CUDAによる複雑な図形処理 195
第9章 メタボール法

  • 9.1 粒子群の濃度場
  • 9.2 ソートによる粒子群のセルへの割り当て
  • 9.3 実装の準備
  • 9.4 基本的なデバイス関数の定義
  • 9.5 カーネル関数の定義
  • 9.6 thrustライブラリ

第10章 マーチングキューブ法

  • 10.1 マーチングキューブ法
  • 10.2 アルゴリズムの概要
  • 10.3 実装の準備
  • 10.4 テクスチャメモリの利用
  • 10.5 カーネル関数の定義
  • 10.6 Metaball.cppの修正

第11章 包含立体の利用

  • 11.1 包含ボックス
  • 11.2 ボックス定義の準備
  • 11.3 AABBとOBBの定義
    • 11.3.1 AABBの定義
    • 11.3.2 OBBの定義
  • 11.4 包含ボックスに関する計算
    • 11.4.1 点と包含ボックス間の距離
    • 11.4.2 包含ボックス間の交差判定
  • 11.5 階層的な包含ボックス
  • 11.6 プログラムの利用法

第12章 立体間の衝突検出

  • 12.1 階層的な包含ボックスによる絞り込み
  • 12.2 ポリゴン間の並列交差判定
  • 12.3 撃力ベース法
  • 12.4 実装の準備
  • 12.5 階層的な包含ボックスによる絞り込み
  • 12.6 撃力ベース法による衝突の解消311
  • 12.7 衝突判定
  • 12.8 デバイス関数
  • 12.9 カーネル関数
  • 12.1 プログラムの利用法
  • あとがき
  • サンプルプログラムの使い方

著者プロフィール

乾正知(いぬいまさとも)

1961年茨城県日立市生まれ。東京大学工学部精密機械工学科卒。東京大学助手,講師,茨城大学助教授を経て,2003年より茨城大学教授。学生時代より,図形処理技術とその機械製造自動化への応用に興味を持っている。趣味(以下,時間を費やしている順に),プログラミング(自己流なので,ソースコードを公開するのはかなり恥ずかしい),天体観察(ただ眺めるだけ。Ninja320所有。ネパールで見た白く濃い天の川とハワイで見たヘールボップ彗星は忘れられません),写真撮影(一度だけ雑誌入選経験あり。キヤノンの古いいカメラを集めています),サッカー観戦(アテネ五輪予選に感動して以来,「なでしこ」のサポーターです),読書(藤沢周平の作品は全巻読破。英国のちょっと下品なフロストシリーズも好き),映画(評価の基準は,とにかく大声で笑えること)。