iOS用OpenGL ESプログラミングガイド (TP )
|
|
|
- なぎさ のあき
- 9 years ago
- Views:
Transcription
1 ios OpenGL ES プログラミングガイド
2 目 次 OpenGL ESについて 10 はじめに 10 OpenGL ESはiOSにおけるプラットフォームに 依 存 しないAPI 11 GLKitによる 描 画 サーフェスとアニメーションサポートの 提 供 11 iosでの 代 替 レンダリング 対 象 のサポート 12 アプリケーションに 必 要 な 追 加 のパフォーマンスチューニング 12 バックグラウンドアプリケーションでOpenGL ESを 使 用 できない 可 能 性 について 13 OpenGL ESによるマルチスレッドアプリケーションへのその 他 の 制 約 事 項 13 この 文 書 の 使 い 方 13 必 要 事 項 14 関 連 項 目 14 OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト 15 サポートするOpenGL ESバージョンの 選 択 15 OpenGL ESの 機 能 の 検 証 16 レンダリング 先 の 選 択 17 iosとの 一 体 化 17 レンダリングエンジンの 実 装 18 デバッグとプロファイル 18 OpenGL ESコンテキストの 設 定 19 EAGLとはOpenGL ESレンダリングコンテキストのiOSにおける 実 装 19 現 在 のコンテキストはOpenGL ES 関 数 呼 び 出 しのターゲット 19 どのコンテキストもOpenGL ESの 特 定 のバージョンをターゲットにする 20 EAGL sharegroupはコンテキストのopengl ESオブジェクトを 管 理 21 OpenGL ESおよびGLKitによる 描 画 24 GLKit ViewはOpenGL ESコンテンツをオンデマンドで 描 画 する 24 GLKit Viewの 作 成 と 設 定 25 GLKit Viewの 描 画 26 デリゲートオブジェクトを 使 用 したレンダリング 28 GLKit View ControllerがOpenGL ESコンテンツをアニメーション 化 する 29 アニメーションループについて 29 GLKit View Controllerの 使 用 30 2
3 目 次 GLKitを 使 用 したレンダラの 開 発 32 ベクトルと 行 列 の 数 値 演 算 の 処 理 32 OpenGL ES 1.1の 固 定 機 能 パイプラインからの 移 行 32 テクスチャデータの 読 み 込 み 33 その 他 のレンダリング 先 への 描 画 34 フレームバッファオブジェクトの 生 成 34 オフスクリーンフレームバッファオブジェクトの 作 成 35 フレームバッファオブジェクトを 使 用 したテクスチャへのレンダリング 36 Core Animationレイヤへのレンダリング 37 フレームバッファオブジェクトへの 描 画 39 オンデマンドまたはアニメーションループでのレンダリング 39 フレームのレンダリング 41 マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 43 マルチタスク 高 解 像 度 iosのその 他 の 機 能 47 マルチタスク 対 応 OpenGL ESアプリケーションの 実 装 47 バックグラウンドのアプリケーションはグラフィックスハードウェアのコマンドを 実 行 しない 場 合 がある 47 作 成 し 直 したリソースをバックグラウンドに 移 動 する 前 に 簡 単 に 削 除 48 高 解 像 度 ディスプレイのサポート 49 デバイスの 向 きに 応 じた 調 整 51 外 部 ディスプレイへのOpenGL ESコンテンツの 表 示 51 OpenGL ES 設 計 ガイドライン 52 OpenGL ESを 視 覚 化 する 方 法 52 クライアント/サーバアーキテクチャとしてのOpenGL ES 52 グラフィックスパイプラインとしてのOpenGL ES 53 OpenGL ESの 版 とレンダラのアーキテクチャ 54 OpenGL ES OpenGL ES OpenGL ES 高 パフォーマンスなOpenGL ESアプリケーションの 設 計 59 同 期 とフラッシュの 操 作 の 回 避 62 glflushの 効 果 的 な 使 用 62 OpenGL ESの 状 態 照 会 の 回 避 63 OpenGL ESを 使 用 したリソースの 管 理 63 ダブルバッファリングによるリソースの 競 合 の 回 避 63 OpenGL ESの 状 態 に 注 意 を 払 う 65 OpenGL ESのオブジェクトで 状 態 をカプセル 化 する 66 3
4 目 次 描 画 関 数 の 呼 び 出 しを 整 理 して 状 態 変 化 を 最 小 限 に 抑 える 66 OpenGL ESアプリケーションのチューニング 68 XcodeやInstrumentsで アプリケーションをデバッグ プロファイリングする 68 XcodeやInstrumentsでOpenGL ESのエラーを 監 視 する 69 情 報 提 供 のデバッグおよびプロファイル 用 に OpenGL ESのコードに 注 釈 を 付 ける 70 パフォーマンスのための 一 般 的 な 推 奨 事 項 71 シーンのデータが 変 更 された 場 合 のみシーンを 再 描 画 する 71 使 用 しないOpenGL ES 機 能 を 無 効 にする 72 ライティングモデルを 簡 素 化 する 72 タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う 72 論 理 バッファの 読 み 込 みや 格 納 を 避 ける 73 隠 面 除 去 を 効 率 的 に 使 う 74 OpenGL ESコマンドをグループ 化 して 効 率 的 にリソースを 管 理 する 75 描 画 コマンドの 数 を 最 小 限 に 抑 える 76 インスタンス 描 画 法 により 描 画 関 数 の 呼 び 出 し 回 数 を 減 らす 76 OpenGL ESのメモリ 消 費 を 最 小 限 に 抑 える 79 Core Animation 合 成 のパフォーマンスに 注 意 する 79 頂 点 データを 扱 うためのベストプラクティス 81 モデルの 簡 素 化 82 属 性 の 配 列 に 定 数 を 格 納 するのを 避 ける 83 属 性 には 可 能 な 限 り 最 小 の 型 を 使 用 する 83 インターリーブされた 頂 点 データを 使 用 する 84 ずれた 頂 点 データを 避 ける 85 三 角 形 ストリップを 使 用 して 頂 点 データを 一 括 処 理 する 85 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 87 バッファの 使 用 に 関 するヒント 89 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 92 バッファをクライアント 側 メモリにマップして 高 速 に 更 新 する 94 テクスチャデータを 扱 うためのベストプラクティス 97 初 期 化 中 にテクスチャをロードする 97 GLKitフレームワークを 使 用 したテクスチャデータの 読 み 込 み 97 テクスチャのメモリ 使 用 量 を 削 減 する 99 テクスチャの 圧 縮 99 低 精 度 のカラーフォーマットを 使 用 する 99 適 切 なサイズのテクスチャを 使 用 する 100 複 数 のテクスチャをテクスチャアトラスにまとめる 100 ミップマップを 使 用 してメモリの 帯 域 幅 の 使 用 を 削 減 する 101 4
5 目 次 マルチパスの 代 わりにマルチテクスチャリングを 使 用 する 101 シェーダのベストプラクティス 103 初 期 化 中 にシェーダをコンパイルおよびリンクする 103 デバッグ 時 のシェーダプログラムエラーのチェック 103 コンパイルとリンクを 高 速 化 するために 別 々のシェーダオブジェクトを 使 用 する 104 シェーダに 関 するハードウェア 制 限 に 従 う 106 精 度 ヒントを 使 用 する 106 ベクトル 計 算 の 時 間 のかかる 実 行 107 シェーダ 内 での 計 算 の 代 わりにuniformまたはconstantを 使 用 する 108 分 岐 命 令 は 注 意 して 使 う 108 ループをなくす 109 シェーダにおける 配 列 インデックスの 計 算 を 避 ける 109 動 的 なテクスチャ 検 索 に 注 意 する 109 プログラマブルブレンディング 用 にフレームバッファのデータを 取 得 する 110 フレームバッファを 取 得 する(GLSL ES 1.0の 場 合 ) 112 フレームバッファを 取 得 する(GLSL ES 3.0の 場 合 ) 113 頂 点 シェーダで より 大 容 量 のメモリバッファとしてテクスチャを 使 う 113 並 列 処 理 とOpenGL ES 115 並 列 処 理 のメリットがあるかどうか 判 断 する 115 OpenGL ESは 各 コンテキストを 単 一 スレッドに 制 限 116 OpenGL ESアプリケーションに 並 列 処 理 を 実 装 する 方 法 117 マルチスレッド 化 したOpenGL ES 118 ワーカータスクにおけるOpenGL ES 演 算 の 実 行 118 複 数 のOpenGL ESコンテキストの 使 用 119 OpenGL ESアプリケーションのスレッド 化 に 関 するガイドライン 120 OpenGL ES 3.0への 移 行 121 OpenGL ES 3.0に 移 行 するためのチェックリスト 121 拡 張 機 能 のコードを 改 訂 する 122 拡 張 機 能 の 接 尾 辞 を 除 去 する 122 拡 張 機 能 APIの 使 い 方 を 修 正 する 122 他 の 拡 張 機 能 も 多 くはOpenGL ES 3.0でもそのまま 利 用 できる 124 OpenGL ESシェーディング 言 語 の 第 3.0 版 に 移 行 する 124 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 126 FPS Debug Gauge および GPU Report の 使 い 方 126 OpenGL ESのフレームを 取 り 込 んで 分 析 する 128 OpenGL ES Frame Debuggerひとめぐり 131 5
6 目 次 ナビゲータ 領 域 132 エディタ 領 域 133 デバッグ 領 域 139 texturetoolを 使 用 したテクスチャの 圧 縮 143 texturetoolのパラメータ 143 書 類 の 改 訂 履 歴 149 用 語 解 説 151 6
7 図 リスト OpenGL ESコンテキストの 設 定 19 図 2-1 2つのコンテキストによるOpenGL ESオブジェクトの 共 有 22 リスト 2-1 同 じアプリケーションでの 複 数 バージョンのOpenGL ESのサポート 20 リスト 2-2 共 通 のsharegroupを 持 つ2つのコンテキストの 作 成 22 OpenGL ESおよびGLKitによる 描 画 24 図 3-1 GLKit ViewでのOpenGL ESコンテンツのレンダリング 25 図 3-2 アニメーションループ 29 リスト 3-1 GLKit Viewの 設 定 26 リスト 3-2 GLKit Viewの 描 画 メソッドの 例 26 リスト 3-3 ハードウェアの 機 能 に 基 づいたレンダラクラスの 選 択 28 リスト 3-4 GLKit ViewおよびView Controllerを 使 用 した OpenGL ESコンテンツの 描 画 とアニメーショ ン 化 30 その 他 のレンダリング 先 への 描 画 34 図 4-1 色 と 深 度 のレンダバッファを 持 つフレームバッファ 34 図 4-2 Core AnimationとOpenGL ESとのレンダバッファの 共 有 37 図 4-3 iosにおけるopenglのレンダリング 手 順 41 図 4-4 マルチサンプル 機 能 の 仕 組 み 44 リスト 4-1 ディスプレイリンクの 作 成 と 開 始 40 リスト 4-2 フレームバッファアタッチメントの 消 去 41 リスト 4-3 深 度 フレームバッファの 破 棄 43 リスト 4-4 レンダリングの 完 了 したフレームの 表 示 43 リスト 4-5 マルチサンプルバッファの 作 成 44 OpenGL ES 設 計 ガイドライン 52 図 6-1 OpenGL ESのクライアント/サーバアーキテクチャ 52 図 6-2 OpenGL ESグラフィックスパイプライン 53 図 6-3 フラグメントシェーダが 多 重 レンダターゲットに 出 力 する 様 子 55 図 6-4 パーティクル 系 アニメーションの 概 要 57 図 6-5 変 換 のフィードバック 機 能 を 利 用 するグラフィックスパイプラインの 構 成 例 58 図 6-6 リソース 管 理 のためのアプリケーションモデル 60 図 6-7 単 一 のバッファに 格 納 されたテクスチャデータ 64 図 6-8 ダブルバッファリングされたテクスチャデータ 65 7
8 図 リスト リスト 6-1 多 重 レンダターゲットを 用 意 するコード 例 55 リスト 6-2 多 重 レンダターゲットに 出 力 するフラグメントシェーダのコード 例 56 OpenGL ESアプリケーションのチューニング 68 図 7-1 デバッグマーカグループの 追 加 前 と 追 加 後 のXcode Frame Debugger 70 図 7-2 透 明 なオブジェクトをトリミングしてフラグメント 処 理 を 減 らす 様 子 75 リスト 7-1 デバッグマーカを 使 って 描 画 コマンドに 注 釈 をつけるコード 例 71 リスト 7-2 デバッグラベルを 利 用 してOpenGL ESオブジェクトに 注 釈 をつけるコード 例 71 リスト 7-3 インスタンス 描 画 法 によらずに よく 似 たオブジェクトを 多 数 描 画 するコード 例 77 リスト 7-4 OpenGL ES 3.0の 頂 点 シェーダが gl_instanceidをもとに インスタンスによって 異 な る 値 を 計 算 するコード 例 77 リスト 7-5 インスタンスごとに 異 なる 情 報 を 頂 点 属 性 に 格 納 するコード 例 78 リスト 7-6 インスタンス 配 列 を 参 照 して 動 作 するOpenGL ES 3.0の 頂 点 シェーダ 78 頂 点 データを 扱 うためのベストプラクティス 81 図 8-1 シェーダ 変 数 への 属 性 データの 変 換 81 図 8-2 インターリーブされたメモリ 構 造 では ある 頂 点 に 関 するすべてのデータがまとめてメ モリに 配 置 されます 84 図 8-3 一 部 のデータの 使 われ 方 が 異 なる 場 合 に 複 数 の 頂 点 構 造 体 を 使 用 する 84 図 8-4 追 加 の 処 理 を 避 けるために 頂 点 データを 揃 える 85 図 8-5 三 角 形 ストリップ 85 図 8-6 縮 退 三 角 形 を 使 用 して 三 角 形 ストリップをマージする 86 図 8-7 頂 点 配 列 オブジェクトの 設 定 93 リスト 8-1 OpenGL ES 3.0でのプリミティブスタートの 使 用 86 リスト 8-2 シェーダプログラムへの 頂 点 データの 送 信 87 リスト 8-3 頂 点 バッファオブジェクトを 生 成 するコード 例 88 リスト 8-4 頂 点 バッファオブジェクトを 使 って 描 画 するコード 例 89 リスト 8-5 複 数 の 頂 点 バッファオブジェクトの 使 用 によるモデルの 描 画 90 リスト 8-6 頂 点 配 列 オブジェクトの 設 定 93 リスト 8-7 手 動 同 期 により 頂 点 バッファを 動 的 に 更 新 するコード 例 95 テクスチャデータを 扱 うためのベストプラクティス 97 リスト 9-1 ファイルからの2 次 元 テクスチャの 読 み 込 み 98 シェーダのベストプラクティス 103 図 10-1 従 来 型 の 固 定 機 能 ブレンディング 110 図 10-2 プログラマブルブレンディングとフレームバッファのデータ 取 得 111 リスト 10-1 開 発 ビルドでのみシェーダのコンパイル/リンクログを 読 み 込 む 103 リスト 10-2 独 立 したシェーダオブジェクトをコンパイル 使 用 するコード 例 104 リスト 10-3 フラグメントの 色 に 低 精 度 を 使 用 する 106 8
9 図 リスト リスト 10-4 ベクトル 演 算 をうまく 活 用 していない 107 リスト 10-5 ベクトル 演 算 の 適 切 な 使 用 107 リスト 10-6 書 き 込 みマスクの 指 定 108 リスト 10-7 従 属 テクスチャ 読 み 込 み 110 リスト 10-8 プログラマブルブレンディングをおこなうフラグメントシェーダの GLSL ES 1.0による 実 装 例 112 リスト 10-9 色 の 後 処 理 を 施 すフラグメントシェーダの GLSL ES 3.0による 実 装 例 113 リスト 高 さマップからレンダリングする 頂 点 シェーダ 114 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 126 図 B-1 FPS Debug Gauge および GPU Report の 画 面 126 図 B-2 Debug バーと Capture OpenGL ES Frame ボタン 129 図 B-3 フレームデバッガに 描 画 関 数 呼 び 出 しとリソースの 状 況 が 表 示 されている 様 子 131 図 B-4 フレームデバッガにシェーダプログラムの 処 理 性 能 や 分 析 結 果 が 表 示 されている 様 子 132 図 B-5 ナビゲータの View Frame By ポップアップメニュー 132 図 B-6 フレームバッファ 情 報 ポップオーバー 134 図 B-7 フレームバッファ 設 定 ポップオーバー 135 図 B-8 GLSLシェーダのソースエディタと 更 新 ボタン 136 図 B-9 アシスタントエディタに 配 列 バッファの 内 容 を 表 示 している 様 子 137 図 B-10 アシスタントエディタに 頂 点 配 列 オブジェクトがプレビュー 表 示 されている 様 子 137 図 B-11 アシスタントエディタにキューブマップテクスチャをプレビュー 表 示 している 様 子 138 図 B-12 OpenGL ESのデバッグバー 139 図 B-13 デバッグ 領 域 に GL Context ビューと Bound GL Objects ビューが 表 示 されている 様 子 140 図 B-14 デバッグ 領 域 に Auto ビューと Context Info ビューが 現 れている 様 子 141 texturetoolを 使 用 したテクスチャの 圧 縮 143 リスト C-1 エンコードオプション 144 リスト C-2 画 像 をPVRTC 圧 縮 フォーマットにエンコードする 147 リスト C-3 プレビューを 作 成 するとともに 画 像 をPVRTC 圧 縮 フォーマットにエンコードする 147 9
10 OpenGL ESについて Open Graphics Library(OpenGL)は 2Dおよび3Dのデータを 視 覚 化 するために 使 用 します OpenGL は オープンスタンダードに 基 づいた 多 用 途 のグラフィックスライブラリで 2Dおよび3Dのデジタ ルコンテンツ 作 成 機 械 設 計 および 建 築 設 計 仮 想 プロトタイピング フライトシミュレーション ビデオゲームなどのアプリケーションをサポートします OpenGLを 使 用 して 3Dグラフィックスパ イプラインを 設 定 し そのパイプラインにデータを 送 信 します 頂 点 は 変 形 およびライティングさ れ プリミティブとして 組 み 立 てられ ラスタ 化 されて2D 画 像 が 作 成 されます OpenGLは 関 数 呼 び 出 しを 基 盤 となるグラフィックスハードウェアに 送 信 可 能 なグラフィックスコマンドに 変 換 するた めに 設 計 されています この 基 盤 ハードウェアはグラフィックスコマンドの 処 理 専 用 のため OpenGL による 描 画 は 一 般 に 非 常 に 高 速 です OpenGL for Embedded Systems(OpenGL ES)は OpenGLの 冗 長 な 機 能 を 取 り 除 いた 簡 略 版 で OpenGL よりも 覚 えやすく モバイルグラフィックスハードウェアに 実 装 しやすいライブラリを 提 供 します はじめに OpenGL ESを 使 用 すると 基 盤 となるグラフィックスプロセッサの 機 能 をアプリケーションが 利 用 で きます iosデバイスのgpuは 洗 練 された2Dおよび3D 描 画 のほか 最 終 画 像 のすべてのピクセルで 複 雑 なシェーディング 計 算 を 実 行 できます OpenGL ESを 使 用 すべきなのは アプリケーションの 設 計 要 件 でGPUハードウェアに 対 して 可 能 な 最 も 直 接 的 かつ 包 括 的 なアクセスが 必 要 とされる 場 合 で す OpenGL ESの 一 般 的 なクライアントとして 3Dグラフィックスを 表 示 するビデオゲームやシミュ レーションがあります OpenGL ESは 低 レベルでハードウェアに 焦 点 を 合 わせたAPIです 最 も 高 機 能 で 柔 軟 なグラフィック ス 処 理 ツールではありますが 学 習 曲 線 が 急 で アプリケーションの 設 計 全 体 に 対 して 重 大 な 影 響 が あります 特 殊 なユーザのために 高 性 能 なグラフィックスが 必 要 なアプリケーションに 対 して ios はいくつかのより 高 レベルなフレームワークを 提 供 します 10
11 OpenGL ESについて はじめに Sprite Kitフレームワークは 2Dゲームの 作 成 に 対 して 最 適 化 された ハードウェアで 加 速 するア ニメーションシステムを 提 供 します (Sprite Kit Programming Guide を 参 照 ) Core Imageフレームワークは 静 止 画 と 動 画 に 対 してリアルタイムのフィルタと 分 析 を 行 います (Core Image Programming Guide を 参 照 ) Core Animationは ハードウェアで 加 速 するグラフィックスレンダリングと すべてのiOSアプリ ケーションのためのアニメーションインフラストラクチャのほか 洗 練 されたユーザインター フェイスのアニメーションを 簡 単 に 実 装 できるようにする 簡 単 な 宣 言 型 プログラミングモデル も 備 えています (Core Animation Programming Guide を 参 照 ) UIKitフレームワークの 機 能 を 使 用 して Cocoa Touchユーザインターフェイスに 対 して アニメー ション 物 理 ベースのダイナミクス およびその 他 の 特 殊 効 果 を 追 加 できます OpenGL ESはiOSにおけるプラットフォームに 依 存 しないAPI OpenGL ESはC 言 語 ベースのAPIであるため 移 植 性 が 非 常 に 高 く 幅 広 くサポートされています OpenGL ESは C 言 語 のAPIとして Objective-CのCocoa Touchアプリケーションとシームレスに 統 合 し ます OpenGL ESの 仕 様 はウインドウレイヤを 定 義 しておらず ホストオペレーティングシステムが OpenGL ESレンダリングコンテキスト(コマンド 受 理 )とフレームバッファ( 描 画 コマンドの 結 果 の 書 き 込 み 先 )を 作 成 する 関 数 を 提 供 しなければなりません ios 上 でOpenGL ESを 使 用 する 場 合 は ios クラスを 使 用 して 描 画 サーフェスを 設 定 および 表 示 し プラットフォームに 依 存 しないAPIを 使 用 し てそのコンテンツをレンダリングします 関 連 する 章 : OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリス ト (15 ページ) OpenGL ESコンテキストの 設 定 (19 ページ) GLKitによる 描 画 サーフェスとアニメーションサポートの 提 供 UIKitフレームワークによって 定 義 された ViewおよびView Controllerにより ios 上 でビジュアルコン テンツの 表 示 が 制 御 されます GLKitフレームワークは これらのクラスのOpenGL ES 対 応 バージョン を 提 供 します OpenGL ESアプリケーションの 開 発 時 に GLKViewオブジェクトを 使 用 してOpenGL ES コンテンツをレンダリングします GLKViewControllerオブジェクトを 使 用 して ビューを 管 理 し たり そのコンテンツのアニメーション 化 をサポートしたりすることもできます 11
12 OpenGL ESについて はじめに 関 連 する 章 : OpenGL ESおよびGLKitによる 描 画 (24 ページ) iosでの 代 替 レンダリング 対 象 のサポート 画 面 全 体 またはビュー 階 層 の 一 部 を 占 める 描 画 コンテンツ 以 外 に 他 のレンダリング 方 法 にOpenGL ES フレームバッファオブジェクトも 使 用 できます iosは 標 準 的 なOpenGL ESフレームバッファオブ ジェクトを 実 装 します これは オフスクリーンバッファやOpenGL ESシーンの 他 の 部 分 で 使 用 する テクスチャへのレンダリングに 使 用 できます さらに ios 上 のOpenGL ESは Core Animationレイヤ (CAEAGLLayerクラス)へのレンダリングをサポートします このレイヤを 他 のレイヤと 結 合 して アプリケーションのユーザインターフェイスまたはその 他 の 視 覚 的 表 示 を 構 築 することができます 関 連 する 章 : その 他 のレンダリング 先 への 描 画 (34 ページ) アプリケーションに 必 要 な 追 加 のパフォーマンスチューニング グラフィックスプロセッサは グラフィックス 操 作 向 けに 最 適 化 された 並 行 処 理 デバイスです アプ リケーションに 優 れたパフォーマンスを 発 揮 させるには グラフィックスハードウェアがアプリケー ションと 並 行 で 動 作 するよう アプリケーションを 注 意 深 く 設 計 してデータとコマンドをOpenGL ES に 供 給 しなければなりません チューニングが 十 分 でないアプリケーションは 一 方 がコマンドの 処 理 を 完 了 するまでCPUまたはGPUのどちらかを 待 機 させることになります OpenGL ES APIを 効 率 よく 使 用 してアプリケーションを 設 計 してください アプリケーションのビルド が 完 了 したら Instrumentsを 使 用 してアプリケーションのパフォーマンスを 微 調 整 します OpenGL ES 内 でアプリケーションのボトルネックが 発 生 している 場 合 は このガイドの 情 報 を 使 用 してアプリ ケーションのパフォーマンスを 最 適 化 してください Xcode は OpenGL ESアプリケーションのパフォーマンスを 向 上 する 新 しいツールを 提 供 します 12
13 OpenGL ESについて この 文 書 の 使 い 方 関 連 する 章 : OpenGL ES 設 計 ガイドライン (52 ページ) 頂 点 データを 扱 うためのベス トプラクティス (81 ページ) テクスチャデータを 扱 うためのベストプラクティ ス (97 ページ) シェーダのベストプラクティス (103 ページ) OpenGL ESアプリケー ションのチューニング (68 ページ) バックグラウンドアプリケーションでOpenGL ESを 使 用 できない 可 能 性 に ついて バックグラウンドで 実 行 されるアプリケーションはOpenGL ES 関 数 を 呼 び 出 さない 場 合 があります アプリケーションがバックグラウンド 時 にグラフィックスプロセッサにアクセスすると iosがアプ リケーションを 自 動 的 に 終 了 します これを 回 避 するには バックグラウンドへの 移 行 前 にOpenGL ES に 送 信 された 未 処 理 のコマンドをフラッシュし アプリケーションがフォアグラウンドに 戻 るまでの 間 OpenGL ESを 呼 び 出 さないようにする 必 要 があります 関 連 する 章 : マルチタスク 高 解 像 度 iosのその 他 の 機 能 (47 ページ) OpenGL ESによるマルチスレッドアプリケーションへのその 他 の 制 約 事 項 並 列 処 理 を 利 用 するようアプリケーションを 設 計 することは アプリケーションパフォーマンスの 向 上 に 役 立 つ 可 能 性 があります OpenGL ESアプリケーションに 並 列 処 理 を 追 加 する 場 合 は アプリケー ションが 異 なる2つのスレッドから 同 じコンテキストに 同 時 にアクセスしないようにしなければな りません 関 連 する 章 : 並 列 処 理 とOpenGL ES (115 ページ) この 文 書 の 使 い 方 まず OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト (15 ペー ジ) OpenGL ESコンテキストの 設 定 (19 ページ) OpenGL ESおよびGLKitによる 描 画 (24 ペー ジ)の3 章 を 読 んでください ここでは OpenGL ESがiOSに 統 合 されている 様 子 を 概 観 した 後 この ライブラリを 活 用 する 初 めてのアプリケーションを 実 装 し iosデバイス 上 で 実 行 するために 必 要 な 事 項 を 詳 しく 解 説 します iosでopengl ESを 使 うための 基 本 事 項 を 理 解 したところで プラットフォームに 特 有 の 重 要 なガイド ラインを 述 べた その 他 のレンダリング 先 への 描 画 (34 ページ) マルチタスク 高 解 像 度 ios のその 他 の 機 能 (47 ページ)の2 章 に 目 を 通 してください ios 5.0 以 前 でOpenGL ESを 使 ったことが ある 開 発 者 向 けに OpenGL ESおよびGLKitによる 描 画 (24 ページ)で 開 発 効 率 の 向 上 に 資 する 新 機 能 を 紹 介 しています 13
14 OpenGL ESについて 必 要 事 項 最 後 に OpenGL ES 設 計 ガイドライン (52 ページ) OpenGL ESアプリケーションのチューニン グ (68 ページ)の2 章 およびそれ 以 降 の 各 章 で 効 率 のよいOpenGL ESアプリケーションの 設 計 法 を 深 く 掘 り 下 げて 解 説 します 特 に 断 りのない 限 り 本 書 のOpenGL ESコード 例 は OpenGL ES 3.0を 対 象 としています 他 のバージョ ンのOpenGL ESでこのコード 例 を 使 用 するには 変 更 を 加 える 必 要 がある 場 合 があります 必 要 事 項 OpenGL ESを 使 用 してみる 前 に iosアプリケーション 全 体 のアーキテクチャに 慣 れておく 必 要 があり ます 詳 細 については Start Developing ios Apps Today を 参 照 してください この 資 料 は 各 種 プラットフォームで 動 作 するOpenGL ESのAPIの 詳 細 なチュートリアルやリファレ ンスとしては 使 えません OpenGL ESについてさらに 詳 しくは 以 下 に 示 す 資 料 を 参 照 してください 関 連 項 目 OpenGL ESはKhronos Groupによって 定 義 された 公 開 標 準 です OpenGL ES 標 準 の 詳 細 については 参 照 してください OpenGL ES 3.0 Programming Guide (Addison-Wesley 刊 行 )は OpenGL ESの 概 念 についての 総 合 的 な 入 門 書 です OpenGL Shading Language, Third Edition (Addison-Wesley 刊 行 )は OpenGL ESアプリケーショ ンで 使 用 可 能 な 多 くのシェーディングアルゴリズムを 提 供 しています これらのアルゴリズムの 一 部 は モバイルグラフィックスプロセッサ 上 で 効 率 よく 実 行 するために 修 正 が 必 要 となる 場 合 があります OpenGL ES API Registryは OpenGL ES 仕 様 OpenGL ESシェーディング 言 語 仕 様 およびOpenGL ES 拡 張 機 能 に 関 する 文 書 の 公 式 リポジトリです OpenGLESFrameworkReference は OpenGL ESをiOSに 統 合 するためにAppleが 提 供 する プラッ トフォーム 固 有 の 関 数 とクラスを 解 説 しています ios Device Compatibility Reference では アプリケーションで 利 用 可 能 なハードウェアおよびソ フトウェア 機 能 についての 詳 細 情 報 が 記 されています GLKit Framework Reference は OpenGL ES 2.0および3.0アプリケーションの 開 発 を 容 易 にする ためにAppleが 提 供 しているフレームワークを 解 説 しています 14
15 OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト OpenGL ESの 仕 様 により GPUハードウェアを 使 用 してグラフィックスをレンダリングするための プラットフォームに 依 存 しないAPIが 定 義 されます OpenGL ESを 実 装 するプラットフォームは OpenGL ESコマンドを 実 行 するためのレンダリングコンテキスト レンダリング 結 果 を 保 持 するフレー ムバッファ およびフレームバッファのコンテンツを 表 示 する1つ 以 上 のレンダリング 先 を 提 供 しま す iosでは EAGLContextクラスがレンダリングコンテキストを 実 装 します iosが 提 供 するフレー ムバッファはOpenGL ESフレームバッファオブジェクトの1 種 類 のみで GLKViewおよびCAEAGLLayer クラスがレンダリング 先 を 実 装 します iosでopengl ESアプリケーションを 構 築 する 場 合 は いくつかの 考 慮 事 項 があります OpenGL ESプ ログラミングに 汎 用 的 なものもあれば iosに 固 有 のものもあります 以 下 のチェックリストとその 下 の 詳 細 な 節 に 従 って 始 めましょう 1. アプリケーションに 対 して 適 切 な 機 能 セットを 持 つOpenGL ESのバージョンを 判 断 し OpenGL ES コンテキストを 作 成 します 2. 使 用 するOpenGL ESの 機 能 がデバイスでサポートされていることを 実 行 時 に 確 認 します 3. OpenGL ESコンテンツのレンダリング 先 を 選 択 します 4. iosでアプリケーションが 正 しく 実 行 されていることを 確 認 します 5. レンダリングエンジンを 実 装 します 6. Use XcodeおよびInstrumentsを 使 用 してOpenGL ESアプリケーションをデバッグし 最 適 なパフォー マンスが 実 現 されるように 調 整 します サポートするOpenGL ESバージョンの 選 択 OpenGL ES 3.0 OpenGL ES 2.0 OpenGL ES 1.1のどれをサポートするか または 複 数 のバージョンをサ ポートするか を 判 断 します OpenGL ES 3.0はiOS 7で 新 たに 導 入 された 版 です 高 い 処 理 性 能 を 実 現 し さまざまな 目 的 にGPU 計 算 技 術 を 駆 使 するばかりでなく 従 来 はデスクトップ 機 やゲームコンソールでしか 実 現 できな かった より 複 雑 な 視 覚 効 果 を 生 み 出 す 数 々の 新 機 能 を 備 えています OpenGL ES 2.0はiOSデバイス 用 のベースラインプロファイルで プログラマブルシェイダを 基 盤 と する 適 合 性 の 高 いグラフィックスパイプラインを 提 供 します 15
16 OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト OpenGL ESの 機 能 の 検 証 OpenGL ES 1.1はごく 基 本 的 な 固 定 機 能 グラフィックスパイプラインを 提 供 するだけであり iosに 今 でも 搭 載 されているのは 後 方 互 換 性 の 維 持 だけが 目 的 です アプリケーションに 最 も 関 係 のある 機 能 やデバイスをサポートするOpenGL ESのバージョンを 対 象 に する 必 要 があります iosデバイスにおけるopengl ESの 能 力 については ios Device Compatibility Reference を 参 照 してください サポートする 予 定 のOpenGL ESのバージョンのコンテキストの 作 成 については OpenGL ESコンテキ ストの 設 定 (19 ページ)を 参 照 してください また OpenGL ESのバージョンによって 利 用 でき るレンダリングアルゴリズムにどのような 違 いがあるか OpenGL ESの 版 とレンダラのアーキテク チャ (54 ページ)で 解 説 します OpenGL ESの 機 能 の 検 証 ios Device Compatibility Reference では iosデバイスの 出 荷 時 に 用 意 されている 機 能 と 拡 張 機 能 の 概 要 を 示 します ただし アプリケーションをできるだけ 多 くのデバイスとiOSバージョン 上 で 実 行 でき るようにするために アプリケーションは 実 行 時 の 機 能 について 必 ずOpenGL ESの 実 装 を 照 会 する 必 要 があります 最 大 テクスチャサイズや 頂 点 属 性 の 最 大 数 など 実 装 固 有 の 制 限 を 確 認 するには そのデータ 型 に 適 したglGet 関 数 を 使 用 して 対 応 するトークンの 値 を 調 べます(gl.hヘッダにあるMAX_TEXTURE_SIZE やMAX_VERTEX_ATTRIBSなど) OpenGL ES 3.0 拡 張 機 能 の 有 無 を 確 認 するには 次 のコード 例 のように glgetintegervおよび glgetstringi 関 数 を 使 用 します BOOL CheckForExtension(NSString *searchname) { // Create a set containing all extension names. // (For better performance, create the set only once and cache it for future use.) int max = 0; glgetintegerv(gl_num_extensions, &max); NSMutableSet *extensions = [NSMutableSet set]; for (int i = 0; i < max; i++) { } [extensions (char *)glgetstringi(gl_extensions, i) )]; return [extensions containsobject: searchname]; 16
17 OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト レンダリング 先 の 選 択 } OpenGL ES 1.1および2.0の 拡 張 機 能 の 有 無 を 確 認 するには glgetstring(gl_extensions)を 呼 び 出 して すべての 拡 張 名 のスペース 区 切 りの 一 覧 を 取 得 します レンダリング 先 の 選 択 In iosでは フレームバッファオブジェクトに 描 画 コマンドの 結 果 が 格 納 されます (iosにはウイン ドウシステム 提 供 のフレームバッファは 実 装 されません )フレームバッファオブジェクトのコンテ ンツは 次 のような 複 数 の 方 法 で 使 用 できます GLKitフレームワークは OpenGL ESコンテンツを 描 画 し 独 自 のフレームバッファオブジェクト を 管 理 するビュー およびOpenGL ESコンテンツのアニメーションをサポートするView Controller を 提 供 します これらのクラスを 使 用 して 全 画 面 表 示 を 作 成 するか OpenGL ESコンテンツを UIKit View 階 層 に 収 めます これらのクラスについては OpenGL ESおよびGLKitによる 描 画 (24 ページ)を 参 照 してください CAEAGLLayerクラスは OpenGL ESコンテンツをCore Animationレイヤ 合 成 の 一 部 として 描 画 する 方 法 を 提 供 します このクラスの 使 用 時 に 独 自 のフレームバッファオブジェクトを 作 成 する 必 要 があります 他 のOpenGL ES 実 装 と 同 様 に オフスクリーングラフィックス 処 理 や グラフィックスパイプラ インの 他 の 部 分 で 使 用 するテクスチャへのレンダリングにもフレームバッファを 使 用 できます OpenGL ES 3.0で オフスクリーンバッファは 複 数 のレンダリング 対 象 を 利 用 するレンダリングア ルゴリズムで 使 用 できます オフスクリーンバッファ テクスチャ またはCore Animationレイヤへのレンダリングについては その 他 のレンダリング 先 への 描 画 (34 ページ)を 参 照 してください iosとの 一 体 化 iosアプリケーションはデフォルトではマルチタスクをサポートしていますが OpenGL ESアプリケー ションでこの 機 能 を 正 しく 扱 うには さらに 考 慮 が 必 要 です OpenGL ESを 適 切 に 使 用 しないと ア プリケーションがバックグラウンドに 移 動 したときにシステムによって 強 制 終 了 される 可 能 性 があり ます 多 くのiOSデバイスには 高 解 像 度 ディスプレイが 含 まれるため アプリケーションは 複 数 の 表 示 サイ ズと 解 像 度 をサポートする 必 要 があります 17
18 OpenGL ESを 組 み 込 んでiOSアプリケーションを 構 築 するためのチェックリスト レンダリングエンジンの 実 装 これらの 機 能 やiOSのその 他 の 機 能 のサポートについては マルチタスク 高 解 像 度 iosのその 他 の 機 能 (47 ページ)を 参 照 してください レンダリングエンジンの 実 装 OpenGL ESの 描 画 コードの 設 計 には 可 能 な 方 法 が 多 数 あり その 詳 細 はこのマニュアルの 範 囲 を 超 え ています レンダリングエンジンの 設 計 の 多 くの 側 面 は OpenGLおよびOpenGL ESのすべての 実 装 に 汎 用 的 です iosの 開 発 者 にとって 重 要 な 設 計 上 の 考 慮 事 項 については OpenGL ES 設 計 ガイドライン (52 ペー ジ)および 並 列 処 理 とOpenGL ES (115 ページ)を 参 照 してください デバッグとプロファイル XcodeおよびInstrumentsは アプリケーションにおいて レンダリングの 問 題 を 特 定 し OpenGL ESの パフォーマンスを 分 析 する 多 数 のツールを 備 えています OpenGL ESアプリケーションでの 問 題 の 解 決 とパフォーマンスの 向 上 については OpenGL ESアプリ ケーションのチューニング (68 ページ)を 参 照 してください 18
19 OpenGL ESコンテキストの 設 定 OpenGL ESのどの 実 装 も OpenGL ES 仕 様 で 求 められる 状 態 を 管 理 するためのレンダリングコンテキス トを 作 成 する 手 段 を 提 供 します この 状 態 をコンテキスト 内 に 配 置 することにより 複 数 のアプリ ケーションが ほかのアプリケーションの 状 態 に 干 渉 することなく グラフィックスハードウェアを 容 易 に 共 有 できます この 章 では ios 上 でコンテキストを 作 成 し 設 定 する 方 法 を 詳 しく 説 明 します EAGLとはOpenGL ESレンダリングコンテキストのiOSにおける 実 装 アプリケーションがOpenGL ES 関 数 を 呼 び 出 せるようにするには アプリケーションがEAGLContext オブジェクトを 初 期 化 する 必 要 があります EAGLContextクラスも OpenGL ESコンテンツをCore Animationに 統 合 するために 使 用 する 手 段 を 提 供 します 現 在 のコンテキストはOpenGL ES 関 数 呼 び 出 しのターゲット iosアプリケーションのすべてのスレッドには 現 在 のコンテキストがあります OpenGL ES 関 数 を 呼 び 出 すと これは 状 態 が 呼 び 出 しによって 変 化 するコンテキストとなります スレッドの 現 在 のコンテキストを 設 定 するには そのスレッドで 実 行 するときにEAGLContextクラス のsetCurrentContext:メソッドを 呼 び 出 します [EAGLContext setcurrentcontext: mycontext]; スレッドの 現 在 のコンテキストを 取 得 するには EAGLContextクラスのcurrentContextメソッドを 呼 び 出 します 19
20 OpenGL ESコンテキストの 設 定 どのコンテキストもOpenGL ESの 特 定 のバージョンをターゲットにする 注 意 : アプリケーションが 同 一 スレッド 上 の2つ 以 上 のコンテキストをアクティブに 切 り 替 える 場 合 新 しいコンテキストを 現 在 のコンテキストに 設 定 する 前 に glflush 関 数 を 呼 び 出 します これにより 事 前 に 送 信 されていたコマンドは 適 切 なタイミングでグラフィッ クスハードウェアに 配 信 されます OpenGL ESは 現 在 のコンテキストに 対 応 する EAGLContextオブジェクトの 強 い 参 照 を 保 持 します ( 独 自 に 参 照 カウントを 実 装 している 場 合 でも OpenGL ESはこのオブジェクトを 保 持 ) setcurrentcontext:メソッドで 現 在 のコンテキストを 変 更 すると OpenGL ESは 前 のコンテキスト を 参 照 できなくなります( 独 自 に 参 照 カウントを 実 装 している 場 合 OpenGL ESはEAGLContextオブ ジェクトを 解 放 ) 現 在 のコンテキストでなくなってもEAGLContextオブジェクトが 割 り 当 て 解 除 さ れないようにしたければ 当 該 オブジェクトに 対 する 強 い 参 照 を 保 持 しなければなりません どのコンテキストもOpenGL ESの 特 定 のバージョンをターゲッ トにする EAGLContextオブジェクトでは 1つのバージョンのOpenGL ESのみがサポートされます たとえば OpenGL ES 1.1 用 に 記 述 されたコードは OpenGL ES 2.0または3.0のコンテキストと 互 換 性 がありませ ん OpenGL ES 2.0のコア 機 能 を 使 用 したコードは OpenGL ES 3.0のコンテキストと 互 換 性 があり OpenGL ES 2.0 拡 張 機 能 用 に 設 計 されたコードは 多 くの 場 合 細 かな 変 更 を 行 うだけでOpenGL ES 3.0 のコンテキストで 使 用 できます OpenGL ES 3.0の 多 くの 新 機 能 や 強 化 されたハードウェア 機 能 では OpenGL ES 3.0のコンテキストが 必 要 です アプリケーションは EAGLContextオブジェクトを 作 成 し 初 期 化 するときに どのバージョンの OpenGL ESをサポートするかを 決 定 します 要 求 されたバージョンのOpenGL ESをデバイスがサポート していない 場 合 initwithapi:メソッドはnilを 返 します アプリケーションは コンテキストが 正 常 に 初 期 化 されたかを 確 認 するためコンテキストを 使 用 する 前 にテストする 必 要 があります アプリケーションので 複 数 バージョンのOpenGL ESをレンダリングオプションとしてサポートするに は まず 対 象 とする 最 新 バージョンのレンダリングコンテキストの 初 期 化 を 試 行 する 必 要 がありま す 返 されたオブジェクトがnilの 場 合 は 古 いバージョンのコンテキストを 初 期 化 します リスト 2-1で この 方 法 を 紹 介 しています リスト 2-1 同 じアプリケーションでの 複 数 バージョンのOpenGL ESのサポート EAGLContext* CreateBestEAGLContext() { EAGLContext *context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles3]; 20
21 OpenGL ESコンテキストの 設 定 EAGL sharegroupはコンテキストのopengl ESオブジェクトを 管 理 if (context == nil) { context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles2]; } return context; } コンテキストのAPIプロパティは コンテキストがサポートするOpenGL ESのバージョンを 示 します アプリケーションは コンテキストのAPIプロパティをテストし そのプロパティを 使 用 して 正 しい レンダリングパスを 選 びます これを 実 装 する 一 般 的 なパターンは 各 レンダリングパスについてク ラスを 作 成 するというものです アプリケーションは 初 期 化 時 にコンテキストをテストし 一 度 レ ンダラを 作 成 します EAGL sharegroupはコンテキストのopengl ESオブジェクトを 管 理 コンテキストはOpenGL ESの 状 態 を 保 持 しますが OpenGL ESオブジェクトを 直 接 管 理 するわけではあ りません OpenGL ESオブジェクトは EAGLSharegroupオブジェクトによって 作 成 され 維 持 され ます どのコンテキストにもオブジェクトの 作 成 をデリゲートするEAGLSharegroupオブジェクトが 含 まれます sharegroupの 利 点 は 2つ 以 上 のコンテキストが 同 じsharegroupを 参 照 する 場 合 に 明 らかになってきま す( 図 2-1を 参 照 ) 複 数 のコンテキストが 共 通 のsharegroupに 接 続 されている 場 合 何 らかのコン テキストで 作 成 したOpenGL ESオブジェクトはすべてのコンテキスト 上 で 利 用 できます オブジェク トを 作 成 したコンテキストではなく 別 のコンテキスト 上 で 同 じオブジェクト 識 別 子 にバインドする と 同 じ OpenGL ESオブジェクトを 参 照 します リソースは モバイルデバイスでは 希 少 な 場 合 が 少 なくありません 複 数 のコンテキストにおいて 同 じコンテンツのコピーを 複 数 作 成 するのは 非 効 率 的 です 共 通 のリソースを 共 有 することで デバイス 上 のグラフィックスリソースの 空 きをより 効 果 的 に 利 用 できます 21
22 OpenGL ESコンテキストの 設 定 EAGL sharegroupはコンテキストのopengl ESオブジェクトを 管 理 sharegroupは 不 透 明 なオブジェクトです 呼 び 出 すことができるメソッドやプロパティはありませ ん sharegroupオブジェクトが 使 用 されるコンテキストでは それに 対 する 強 参 照 が 保 持 されます 図 2-1 2つのコンテキストによるOpenGL ESオブジェクトの 共 有 sharegroupは 次 に 示 す2つの 具 体 的 シナリオで 最 も 有 用 です コンテキスト 間 で 共 有 されているリソースのほとんどが 変 更 されない 場 合 レンダラのメインスレッド 以 外 のスレッド 上 に アプリケーションが 新 たなOpenGL ESオブジェ クトを 作 成 できるようにしたい 場 合 この 場 合 2つ 目 のコンテキストは 独 立 したスレッド 上 で 実 行 され データのフェッチとリソースの 作 成 に 充 てられます リソースがロードされた 後 最 初 のコンテキストはオブジェクトにバインドしてすぐに 使 用 できます GLKTextureLoaderクラ スは このパターンを 使 用 して テクスチャの 非 同 期 読 み 込 みを 実 行 します 同 じsharegroupを 参 照 する 複 数 のコンテキストを 作 成 するには 最 初 のコンテキストをinitWithAPI: を 呼 び 出 して 初 期 化 します sharegroupはそのコンテキストに 対 して 自 動 的 に 作 成 されます 2つ 目 以 降 のコンテキストは initwithapi:sharegroup:メソッドを 呼 び 出 すことにより 最 初 のコンテ キストのsharegroupを 使 用 するよう 初 期 化 されます リスト 2-2では この 仕 組 みについて 説 明 して います 最 初 のコンテキストは リスト 2-1 (20 ページ)で 定 義 される 簡 易 関 数 を 使 用 して 作 成 さ れます 2つ 目 のコンテキストは 最 初 のコンテキストからAPIのバージョンとsharegroupを 抽 出 して 作 成 されます Important: 同 じsharegroupに 関 連 付 けられたすべてのコンテキストは 初 期 コンテキストと 同 じ バージョンのOpenGL ES APIを 使 用 する 必 要 があります リスト 2-2 共 通 のsharegroupを 持 つ2つのコンテキストの 作 成 EAGLContext* firstcontext = CreateBestEAGLContext(); EAGLContext* secondcontext = [[EAGLContext alloc] initwithapi:[firstcontext API] sharegroup: [firstcontext sharegroup]]; 22
23 OpenGL ESコンテキストの 設 定 EAGL sharegroupはコンテキストのopengl ESオブジェクトを 管 理 sharegroupが 複 数 のコンテキストによって 共 有 されている 場 合 OpenGL ESオブジェクトに 生 じる 状 態 の 変 化 の 管 理 はアプリケーションの 役 割 です 変 化 の 管 理 に 関 する 規 則 は 次 のとおりです オブジェクトの 修 正 中 ではない 場 合 複 数 のコンテキストにわたって 同 時 にそのオブジェクトに アクセスすることが 可 能 コンテキストに 送 信 されたコマンドによってオブジェクトが 修 正 されている 間 オブジェクトを 読 み 取 ったり ほかのコンテキスト 上 でオブジェクトを 修 正 したりしてはならない オブジェクトが 修 正 された 後 すべてのコンテキストがオブジェクトを 再 バインドして 変 更 を 認 識 する 必 要 がある オブジェクトのコンテンツは コンテキストがバインドする 前 にオブジェク トを 参 照 している 場 合 は 未 定 義 である OpenGL ESオブジェクトを 更 新 するためにアプリケーションが 従 う 手 順 は 次 のとおりです 1. オブジェクトを 使 用 する 可 能 性 のあるコンテキストごとにglFlushを 呼 び 出 す 2. オブジェクトを 修 正 するコンテキスト 上 で 1つ 以 上 のOpenGL ES 関 数 を 呼 び 出 してオブジェクト に 変 更 を 加 える 3. 状 態 変 更 コマンドを 受 信 するコンテキスト 上 でglFlushを 呼 び 出 す 4. そのほかの 各 コンテキスト 上 で オブジェクト 識 別 子 を 再 バインドする 注 意 : オブジェクトを 共 有 するもう1つの 方 法 は 単 一 のレンダリングコンテキストではな く 複 数 のレンダリング 先 フレームバッファを 使 用 することです レンダリング 時 におい て アプリケーションは 適 切 なフレームバッファをバインドし 必 要 に 応 じてフレームをレ ンダリングします すべてのOpenGL ESオブジェクトは 単 一 のコンテキストから 参 照 される ため OpenGL ESオブジェクトは 同 一 のOpenGL ESデータを 認 識 しています この 方 法 はリ ソースはあまり 使 用 しませんが コンテキストの 状 態 を 細 かく 制 御 可 能 な 単 一 スレッドのア プリケーションでしか 有 用 ではありません 23
24 OpenGL ESおよびGLKitによる 描 画 GLKitフレームワークは OpenGL ESコンテンツの 描 画 やアニメーションに 必 要 な 設 定 および 保 守 コー ドが 不 要 なViewおよびView Controllerクラスを 提 供 します GLKViewクラスは 描 画 コードの 場 所 を 提 供 するOpenGL ESインフラストラクチャを 管 理 し GLKViewControllerクラスはGLKit ViewでのOpenGL ES コンテンツの 滑 らかなアニメーションのレンダリングループを 提 供 します これらのクラスにより ビューコンテンツの 描 画 とビュープレゼンテーションの 管 理 のための 標 準 的 なUIKit 設 計 パターンが 拡 張 されます 結 果 として OpenGL ESレンダリングコードに 集 中 的 に 取 り 組 み 短 期 間 でアプリケー ションを 稼 働 させることができます GLKitフレームワークは OpenGL ES 2.0および3.0の 開 発 を 容 易 にするその 他 の 機 能 も 備 えています GLKit ViewはOpenGL ESコンテンツをオンデマンドで 描 画 する GLKViewクラスは 標 準 的 なUIView 描 画 サイクルのOpenGL ESベースの 等 価 物 を 提 供 します UIView インスタンスは drawrect: 実 装 がQuartz 2D 描 画 コマンドのみを 実 行 する 必 要 があるようにグラフィッ クコンテキストを 自 動 的 に 設 定 し GLKViewインスタンスは 描 画 メソッドがOpenGL ES 描 画 コマン ドのみを 実 行 する 必 要 があるようにそれ 自 体 を 自 動 的 に 設 定 します GLKViewクラスは OpenGL ES 描 画 コマンドの 結 果 を 保 持 し 描 画 メソッドが 返 されると 結 果 をCore Animationに 自 動 的 に 表 示 する フレームバッファオブジェクトを 管 理 することによって この 機 能 を 提 供 します 標 準 的 なUIKit Viewと 同 様 に GLKit Viewはそのコンテンツをオンデマンドでレンダリングします ビューは 最 初 に 表 示 されたときに 描 画 メソッドを 呼 び 出 します Core Animationはレンダリング 出 力 をキャッシュし ビューが 表 示 されるたびにそれを 表 示 します ビューのコンテンツを 変 更 するとき は そのsetNeedsDisplayメソッドを 呼 び 出 すと ビューは 再 び 描 画 メソッドを 呼 び 出 し 結 果 の 画 像 をキャッシュし それを 画 面 に 表 示 します この 方 法 は 画 像 のレンダリングに 使 用 するデータが 24
25 OpenGL ESおよびGLKitによる 描 画 GLKit ViewはOpenGL ESコンテンツをオンデマンドで 描 画 する あまり 頻 繁 に 変 化 しない 場 合 や ユーザのアクションに 応 答 してのみ 変 化 する 場 合 に 有 用 です 必 要 なときだけ 新 しいビューコンテンツをレンダリングすることによって デバイスのバッテリーが 節 約 され デバイスがほかのアクションを 実 行 する 時 間 が 長 くなります 図 3-1 GLKit ViewでのOpenGL ESコンテンツのレンダリング GLKit Viewの 作 成 と 設 定 GLKViewオブジェクトは プログラムまたはInterface Builderを 使 用 して 作 成 および 設 定 できます 描 画 に 使 用 する 前 に EAGLContextオブジェクトと 関 連 付 ける 必 要 があります( OpenGL ESコンテキス トの 設 定 (19 ページ)を 参 照 ) ビューをプログラムで 作 成 するときは 最 初 にコンテキストを 作 成 し それをビューの initwithframe:context:メソッドに 渡 します ストーリーボードからビューを 読 み 込 んだ 後 コンテキストを 作 成 し ビューのcontextプロパ ティ 値 として 設 定 します GLKit Viewは その 独 自 のOpenGL ESフレームバッファオブジェクトとレンダバッファを 自 動 的 に 作 成 および 設 定 します リスト 3-1に 示 すように ビューの 描 画 可 能 プロパティを 使 用 してこれらのオブ ジェクトの 属 性 を 制 御 します GLKit Viewのサイズ 倍 率 描 画 可 能 プロパティを 変 更 すると 次 回 のコンテンツ 描 画 時 に 適 切 なフレームバッファオブジェクトとレンダバッファが 自 動 的 に 削 除 および 再 作 成 されます 25
26 OpenGL ESおよびGLKitによる 描 画 GLKit ViewはOpenGL ESコンテンツをオンデマンドで 描 画 する リスト 3-1 GLKit Viewの 設 定 - (void)viewdidload { [super viewdidload]; // Create an OpenGL ES context and assign it to the view loaded from storyboard GLKView *view = (GLKView *)self.view; view.context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles2]; // Configure renderbuffers created by the view view.drawablecolorformat = GLKViewDrawableColorFormatRGBA8888; view.drawabledepthformat = GLKViewDrawableDepthFormat24; view.drawablestencilformat = GLKViewDrawableStencilFormat8; } // Enable multisampling view.drawablemultisample = GLKViewDrawableMultisample4X; GLKViewインスタンスのマルチサンプル 機 能 をそのdrawableMultisampleプロパティを 使 用 して 有 効 にできます マルチサンプル 機 能 は ギザギザのエッジを 滑 らかするアンチエイリアスの 一 種 で よ り 多 くのメモリとフラグメント 処 理 時 間 を 使 用 して3Dアプリケーションでの 画 質 を 向 上 させます マ ルチサンプル 機 能 を 有 効 にする 場 合 は パフォーマンスが 許 容 できる 水 準 を 維 持 できるよう アプリ ケーションのパフォーマンスを 必 ずテストしてください GLKit Viewの 描 画 図 3-1 (25 ページ)では OpenGL ESコンテンツを 描 画 するための3つのステップ(OpenGL ESインフ ラストラクチャの 準 備 描 画 コマンドの 発 行 Core Animationへのレンダリングコンテンツの 表 示 ) の 概 要 を 説 明 します GLKViewクラスは 最 初 のステップと3 番 目 のステップを 実 装 します 2 番 目 の ステップについては リスト 3-2の 中 の 例 のような 描 画 メソッドを 実 装 します リスト 3-2 GLKit Viewの 描 画 メソッドの 例 - (void)drawrect:(cgrect)rect { // Clear the framebuffer 26
27 OpenGL ESおよびGLKitによる 描 画 GLKit ViewはOpenGL ESコンテンツをオンデマンドで 描 画 する glclearcolor(0.0f, 0.0f, 0.1f, 1.0f); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // Draw using previously configured texture, shader, uniforms, and vertex array glbindtexture(gl_texture_2d, _planettexture); gluseprogram(_diffuseshading); gluniformmatrix4fv(_uniformmodelviewprojectionmatrix, 1, 0, _modelviewprojectionmatrix.m); } glbindvertexarrayoes(_planetmesh); gldrawelements(gl_triangle_strip, 256, GL_UNSIGNED_SHORT); 注 意 : glclear 関 数 は 既 存 のフレームバッファコンテンツを 破 棄 できるというヒントを OpenGL ESに 伝 達 し それまでのコンテンツをメモリに 読 み 込 むという 負 担 のかかるメモリ 操 作 を 回 避 します 最 適 なパフォーマンスを 確 保 するために 描 画 の 前 には 必 ずこの 関 数 を 呼 び 出 す 必 要 があります GLKViewクラスは OpenGL ESのレンダリングプロセスの 標 準 的 な 部 分 を 管 理 するため OpenGL ESの 描 画 のための 簡 単 なインターフェイスを 提 供 します 描 画 メソッドを 呼 び 出 す 前 に ビューは 次 のことを 行 います EAGLContextオブジェクトを 現 在 のコンテキストにする フレームバッファオブジェクトとレンダバッファオブジェクトを その 現 在 のサイズ 倍 率 および 描 画 可 能 プロパティ( 必 要 に 応 じて)に 基 づいて 作 成 する フレームバッファオブジェクトを 描 画 コマンドの 現 在 の 発 行 先 としてバインドする フレームバッファサイズに 一 致 するようにOpenGL ESビューポートを 設 定 する 描 画 メソッドが 返 された 後 ビューは 次 のことを 行 います マルチサンプル 機 能 のバッファを 解 決 する(マルチサンプル 機 能 が 有 効 になっている 場 合 ) コンテンツが 不 要 になったレンダバッファを 破 棄 する レンダリングバッファのコンテンツをキャッシュと 表 示 のためにCore Animationに 表 示 する 27
28 OpenGL ESおよびGLKitによる 描 画 デリゲートオブジェクトを 使 用 したレンダリング デリゲートオブジェクトを 使 用 したレンダリング 多 くのOpenGL ESアプリケーションでは カスタムクラスにレンダリングコードが 実 装 されています この 方 法 の 利 点 は それぞれに 対 して 異 なるレンダリングクラス 複 数 のレンダリングアルゴリズムを 簡 単 にサポートできる 点 です 一 般 的 な 機 能 を 共 有 するレンダリングアルゴリズムは スーパークラ スからその 機 能 を 継 承 できます たとえば OpenGL ES 2.0と3.0の 両 方 をサポートするために 異 な るレンダラクラスを 使 用 することができます( OpenGL ESコンテキストの 設 定 (19 ページ)を 参 照 ) または それらを 使 用 して より 高 性 能 のハードウェアのデバイス 上 で 画 質 を 向 上 させるため にレンダリングをカスタマイズすることができます GLKitはこの 方 法 に 大 変 適 しています レンダラオブジェクトを 標 準 的 なGLKViewインスタンスのデリ ゲートにすることができます GLKViewのサブクラスを 定 義 し drawrect:メソッドを 実 装 する 代 わ りに レンダラクラスはGLKViewDelegateプロトコルを 使 用 し glkview:drawinrect:メソッドを 実 装 します リスト 3-3は アプリケーションの 起 動 時 にハードウェアに 機 能 に 基 づいてレンダラク ラスを 選 択 する 方 法 を 示 します リスト 3-3 ハードウェアの 機 能 に 基 づいたレンダラクラスの 選 択 - (BOOL)application:(UIApplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { // Create a context so we can test for features EAGLContext *context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles2]; [EAGLContext setcurrentcontext:context]; // Choose a rendering class based on device features GLint maxtexturesize; glgetintegerv(gl_max_texture_size, &maxtexturesize); if (maxtexturesize > 2048) self.renderer = [[MyBigTextureRenderer alloc] initwithcontext:context]; else self.renderer = [[MyRenderer alloc] initwithcontext:context]; // Make the renderer the delegate for the view loaded from the main storyboard GLKView *view = (GLKView *)self.window.rootviewcontroller.view; view.delegate = self.renderer; 28
29 OpenGL ESおよびGLKitによる 描 画 GLKit View ControllerがOpenGL ESコンテンツをアニメーション 化 する // Give the OpenGL ES context to the view so it can draw view.context = context; } return YES; GLKit View ControllerがOpenGL ESコンテンツをアニメーション 化 する GLKViewオブジェクトは デフォルトでは オンデマンドでそのコンテンツをレンダリングします とはいえ OpenGL ESでの 描 画 の 重 要 な 利 点 は 複 雑 なシーンの 連 続 的 なアニメーション すなわち 静 止 画 像 を 表 示 することがほとんどないゲームやシミュレーションなどのアプリケーションに グラ フィックス 処 理 ハードウェアを 使 用 できることです このような 場 合 に GLKitフレームワークは 管 理 するGLKViewオブジェクトのアニメーションループを 管 理 するView Controllerクラスを 提 供 します このループは 更 新 と 表 示 の2つのフェーズで ゲームやシミュレーションで 一 般 的 な 設 計 パターン に 従 います 図 3-2に アニメーションループの 簡 単 な 例 を 示 します 図 3-2 アニメーションループ アニメーションループについて 更 新 フェーズでは View Controllerがその 独 自 のupdateメソッド(またはそのデリゲートの glkviewcontrollerupdate:メソッド)を 呼 び 出 します このメソッドでは 次 のフレームを 描 画 す る 準 備 をする 必 要 があります たとえば ゲームでは このメソッドを 使 用 して 最 後 のフレーム 以 降 に 受 信 された 入 力 イベントに 基 づいて ユーザや 敵 のキャラクターの 位 置 を 決 定 することができま す サイエンティフィックビジュアライゼーションでは このメソッドを 使 用 してそのシミュレー 29
30 OpenGL ESおよびGLKitによる 描 画 GLKit View ControllerがOpenGL ESコンテンツをアニメーション 化 する ションのステップを 実 行 することができます 次 のフレームのアプリケーションの 状 態 を 判 断 するた めにタイミング 情 報 が 必 要 な 場 合 は timesincelastupdateプロパティなど View Controllerのいず れかのタイミングプロパティを 使 用 します 図 3-2では 更 新 フェーズでangle 変 数 が 増 え それを 使 用 して 変 換 行 列 が 計 算 されています 表 示 フェーズでは View Controllerがそのビューのdisplayメソッドを 呼 び 出 し 今 度 はそれが 描 画 メ ソッドを 呼 び 出 します 描 画 メソッドでは OpenGL ES 描 画 コマンドをGPUに 送 信 して コンテンツ をレンダリングします 最 適 なパフォーマンスのために アプリケーションは 新 しいフレームのレ ンダリング 開 始 時 にOpenGL ESオブジェクトを 修 正 し その 後 描 画 コマンドを 送 信 する 必 要 があり ます 図 3-2では 表 示 フェーズでシェーダプログラムのuniform 変 数 が 更 新 フェーズで 計 算 された 行 列 に 設 定 され 描 画 コマンドを 送 信 して 新 しいコンテンツがレンダリングされています アニメーションループでは これらの2つのフェーズがView ControllerのframesPerSecondプロパティ によって 指 定 された 速 度 で 繰 り 返 されます preferredframespersecondプロパティを 使 用 して 希 望 のフレームレートを 設 定 できます View Controllerでは 現 在 の 表 示 ハードウェアのパフォーマン スを 最 適 化 するために 希 望 の 値 に 近 い 最 適 なフレームレートが 自 動 的 に 選 択 されます Important: 最 良 の 結 果 を 得 るためには アプリケーションが 一 貫 して 達 成 可 能 なフレームレート を 選 びます スムーズで 一 貫 したフレームレートは 一 貫 性 のないフレームレートの 場 合 よりも より 快 適 なユーザ 体 験 を 提 供 します GLKit View Controllerの 使 用 リスト 3-4では GLKViewControllerサブクラスとGLKViewインスタンスを 使 用 して アニメーショ ン 化 されたOpenGL ESコンテンツをレンダリングするための 一 般 的 な 方 法 を 示 します リスト 3-4 GLKit ViewおよびView Controllerを 使 用 した OpenGL ESコンテンツの 描 画 とアニメーション PlanetViewController // subclass of GLKViewController - (void)viewdidload { [super viewdidload]; // Create an OpenGL ES context and assign it to the view loaded from storyboard GLKView *view = (GLKView *)self.view; view.context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles2]; 30
31 OpenGL ESおよびGLKitによる 描 画 GLKit View ControllerがOpenGL ESコンテンツをアニメーション 化 する // Set animation frame rate self.preferredframespersecond = 60; } // Not shown: load shaders, textures and vertex arrays, set up projection matrix [self setupgl]; - (void)update { _rotation += self.timesincelastupdate * M_PI_2; // one quarter rotation per second // Set up transform matrices for the rotating planet GLKMatrix4 modelviewmatrix = GLKMatrix4MakeRotation(_rotation, 0.0f, 1.0f, 0.0f); _normalmatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); _modelviewprojectionmatrix = GLKMatrix4Multiply(_projectionMatrix, modelviewmatrix); } - (void)glkview:(glkview *)view drawinrect:(cgrect)rect { // Clear the framebuffer glclearcolor(0.0f, 0.0f, 0.1f, 1.0f); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // Set shader uniforms to values calculated in -update gluseprogram(_diffuseshading); gluniformmatrix4fv(_uniformmodelviewprojectionmatrix, 1, 0, _modelviewprojectionmatrix.m); gluniformmatrix3fv(_uniformnormalmatrix, 1, 0, _normalmatrix.m); // Draw using previously configured texture and vertex array glbindtexture(gl_texture_2d, _planettexture); glbindvertexarrayoes(_planetmesh); gldrawelements(gl_triangle_strip, 256, GL_UNSIGNED_SHORT, 0); 31
32 OpenGL ESおよびGLKitによる 描 画 GLKitを 使 用 したレンダラの 開 発 この 例 では PlanetViewControllerクラス(カスタムGLKViewControllerサブクラス)のインスタ ンスが 標 準 的 なGLKViewインスタンスとその 描 画 可 能 プロパティとともに ストーリーボードから 読 み 込 まれます viewdidloadメソッドでは OpenGL ESコンテキストが 作 成 され それがビューに 指 定 され アニメーションループのフレームレートも 設 定 されます View Controllerは 自 動 的 にそのビューのデリゲートとなるため アニメーションループの 更 新 フェー ズと 表 示 フェーズの 両 方 を 実 装 します updateメソッドでは 回 転 惑 星 の 表 示 に 必 要 な 変 換 行 列 を 計 算 します glkview:drawinrect:メソッドでは シェーダプログラムにそれらの 行 列 を 指 定 し 描 画 コマンドを 送 信 して 惑 星 ジオメトリをレンダリングします GLKitを 使 用 したレンダラの 開 発 GLKitフレームワークは ViewおよびView Controllerインフラストラクチャに 加 えて iosでのopengl ES 開 発 を 容 易 にするための 他 のいくつかの 機 能 を 提 供 します ベクトルと 行 列 の 数 値 演 算 の 処 理 OpenGL ES 2.0 以 降 では 変 換 行 列 を 作 成 または 指 定 するための 組 み 込 み 関 数 が 用 意 されていません 代 わりに プログラム 可 能 なシェーダには 頂 点 変 換 が 用 意 されており 一 般 的 なuniform 変 数 を 使 用 してシェーダへの 入 力 を 指 定 します GLKitフレームワークには iosハードウェアの 高 いパフォーマ ンスのために 最 適 化 された ベクトルおよび 行 列 タイプと 関 数 の 包 括 的 なライブラリが 含 まれていま す (GLKit Framework Reference を 参 照 ) OpenGL ES 1.1の 固 定 機 能 パイプラインからの 移 行 OpenGL ES 2.0 以 降 では OpenGL ES 1.1の 固 定 機 能 グラフィックスパイプラインに 関 連 する 機 能 がすべ て 削 除 されています GLKBaseEffectクラスは OpenGL ES 1.1パイプラインの 変 換 ライティング シェーディング 段 階 にObjective-Cアナログを 提 供 し GLKSkyboxEffectおよび GLKReflectionMapEffectクラスは 一 般 的 な 視 覚 効 果 のサポートを 追 加 します 詳 細 については こ れらのクラスのリファレンスマニュアルを 参 照 してください 32
33 OpenGL ESおよびGLKitによる 描 画 GLKitを 使 用 したレンダラの 開 発 テクスチャデータの 読 み 込 み GLKTextureLoaderクラスには iosでサポートされている 任 意 の 画 像 形 式 からOpenGL ESコンテキス トにテクスチャデータを 同 期 的 または 非 同 期 的 に 簡 単 に 読 み 込 む 方 法 が 用 意 されています ( GLKit フレームワークを 使 用 したテクスチャデータの 読 み 込 み (97 ページ)を 参 照 してください ) 33
34 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトは レンダリングコマンドの 送 信 先 です フレームバッファオブジェ クトを 作 成 すると 色 深 度 および ステンシルデータを 正 確 に 制 御 できます このストレージを 提 供 するには 画 像 をフレームバッファにアタッチします( 図 4-1を 参 照 ) 最 も 一 般 的 な 画 像 アタッ チメントはレンダバッファオブジェクトです OpenGL ESテクスチャをフレームバッファの 色 アタッ チメントポイントにアタッチすることもできます これは 描 画 コマンドがテクスチャにレンダリン グされることを 意 味 します 画 像 がレンダリングされたテクスチャは その 後 使 用 されるレンダリン グコマンドの 入 力 の 役 割 を 果 たすことができます 単 一 のレンダリングコンテキストに 複 数 のフレー ムバッファオブジェクトを 作 成 することもできます これによって 同 じレンダリングパイプライン とOpenGL ESリソースを 複 数 のフレームバッファ 間 で 共 有 することができます 図 4-1 色 と 深 度 のレンダバッファを 持 つフレームバッファ これらのすべての 方 法 において OpenGL ESコンテキストのレンダリング 結 果 を 格 納 するフレームバッ ファオブジェクトとレンダバッファオブジェクトを 手 動 で 作 成 する 必 要 があるほか コンテンツを 画 面 に 表 示 し ( 必 要 に 応 じて)アニメーションループを 実 行 するための 追 加 コードを 記 述 する 必 要 が あります フレームバッファオブジェクトの 生 成 アプリケーションは 実 行 しようとするタスクに 応 じて 異 なるオブジェクトを 設 定 し フレームバッ ファオブジェクトにアタッチします ほとんどの 場 合 フレームバッファの 設 定 における 違 いは フ レームバッファオブジェクトの 色 アタッチメントポイントにどのオブジェクトがアタッチされるかと いうことです 34
35 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトの 生 成 オフスクリーンの 画 像 処 理 にフレームバッファを 使 用 するには レンダバッファをアタッチしま す 詳 細 については オフスクリーンフレームバッファオブジェクトの 作 成 (35 ページ)を 参 照 してください フレームバッファの 画 像 を 後 のレンダリング 手 順 の 入 力 として 使 用 するには テクスチャをア タッチします 詳 細 については フレームバッファオブジェクトを 使 用 したテクスチャへのレン ダリング (36 ページ)を 参 照 してください Core Animationレイヤ 合 成 でフレームバッファを 使 用 するには 特 別 なCore Animation 対 応 レンダ バッファを 使 用 してください 詳 細 については Core Animationレイヤへのレンダリング (37 ペー ジ)を 参 照 してください オフスクリーンフレームバッファオブジェクトの 作 成 オフスクリーンレンダリングのためのフレームバッファは そのアタッチメントのすべてをOpenGL ES レンダバッファとして 割 り 当 てます 次 のコードは 色 アタッチメントおよび 深 度 アタッチメントを 持 つフレームバッファオブジェクトを 割 り 当 てます 1. フレームバッファを 作 成 し それをバインドします GLuint framebuffer; glgenframebuffers(1, &framebuffer); glbindframebuffer(gl_framebuffer, framebuffer); 2. 色 レンダバッファを 作 成 し それにストレージを 割 り 当 て フレームバッファの 色 アタッチメン トポイントにストレージをアタッチします GLuint colorrenderbuffer; glgenrenderbuffers(1, &colorrenderbuffer); glbindrenderbuffer(gl_renderbuffer, colorrenderbuffer); glrenderbufferstorage(gl_renderbuffer, GL_RGBA8, width, height); glframebufferrenderbuffer(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorrenderbuffer); 3. 深 度 または 深 度 /ステンシルのレンダバッファを 作 成 し それにストレージを 割 り 当 て フレー ムバッファの 深 度 アタッチメントポイントにストレージをアタッチします GLuint depthrenderbuffer; glgenrenderbuffers(1, &depthrenderbuffer); glbindrenderbuffer(gl_renderbuffer, depthrenderbuffer); 35
36 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトの 生 成 glrenderbufferstorage(gl_renderbuffer, GL_DEPTH_COMPONENT16, width, height); glframebufferrenderbuffer(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer); 4. フレームバッファの 完 全 性 をテストします このテストは フレームバッファの 設 定 が 変 更 され た 場 合 のみ 実 行 する 必 要 があります GLenum status = glcheckframebufferstatus(gl_framebuffer) ; if(status!= GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete framebuffer object %x", status); } オフスクリーンレンダバッファへの 描 画 後 glreadpixels 関 数 を 使 用 してさらに 処 理 するために そのコンテンツをCPUに 戻 すことができます フレームバッファオブジェクトを 使 用 したテクスチャへのレンダリング このフレームバッファを 作 成 するコードは オフスクリーンの 例 のものとほとんど 同 じですが テク スチャが 割 り 当 てられて 色 アタッチメントポイントにアタッチされる 点 が 異 なります 1. ( オフスクリーンフレームバッファオブジェクトの 作 成 (35 ページ)と 同 じ 手 順 で)フレー ムバッファオブジェクトを 作 成 します 2. レンダリング 先 のテクスチャを 作 成 し そのテクスチャをフレームバッファの 色 アタッチメント ポイントにアタッチします // create the texture GLuint texture; glgentextures(1, &texture); glbindtexture(gl_texture_2d, texture); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glteximage2d(gl_texture_2d, 0, GL_RGBA8, GL_UNSIGNED_BYTE, NULL); width, height, 0, GL_RGBA, glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 3. 深 度 バッファを 割 り 当 ててアタッチします( 前 述 のとおり) 4. フレームバッファの 完 全 性 をテストします( 前 述 のとおり) 36
37 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトの 生 成 この 例 は 色 テクスチャへのレンダリングを 前 提 としていますが ほかの 方 法 をとることができます たとえば OES_depth_texture 拡 張 機 能 を 使 用 することで テクスチャを 深 度 アタッチメントポイ ントにアタッチし シーンから 得 た 深 度 情 報 をテクスチャに 格 納 することができます この 深 度 情 報 を 使 用 して 最 終 的 にレンダリングされるシーンの 影 を 計 算 することができます Core Animationレイヤへのレンダリング Core Animationは iosでのグラフィクスレンダリングとアニメーションの 中 心 的 なインフラストラク チャです UIKit Quartz 2D OpenGL ESなどのさまざまなiOSサブシステムを 使 用 してレンダリングさ れたコンテツをホストするレイヤを 使 用 して アプリケーションのユーザインターフェイスまたはそ の 他 の 視 覚 的 表 示 を 合 成 できます OpenGL ESは CAEAGLLayerクラス コンテンツがOpenGL ESレン ダバッファに 由 来 する 特 殊 な 種 類 のCore Animationレイヤを 介 して Core Animationに 接 続 します Core Animationは レンダバッファのコンテンツと 他 のレイヤのコンテンツとを 合 成 し 結 果 の 画 像 を 画 面 に 表 示 します 図 4-2 Core AnimationとOpenGL ESとのレンダバッファの 共 有 CAEAGLLayerは 2つの 重 要 な 機 能 を 提 供 することによって このサポートをOpenGL ESに 提 供 しま す 1つは レンダバッファ 用 の 共 有 ストレージを 割 り 当 てることです 2つ 目 は Core Animationに レンダバッファを 表 示 し レイヤのそれ 以 前 のコンテンツをレンダバッファのデータで 置 き 換 えま す このモデルの 利 点 は Core Animationレイヤのコンテンツを フレームごとに 描 画 する 必 要 がな く レンダリングされた 画 像 が 変 化 する 場 合 だけレンダリングすればよいということです 注 意 : GLKViewクラスは 以 下 の 手 順 を 自 動 化 するため ビューのコンテンツレイヤでOpenGL ES を 使 用 して 描 画 するときにこのクラスを 使 用 する 必 要 があります OpenGL ESレンダリングでCore Animationレイヤを 使 用 するには 37
38 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトの 生 成 1. CAEAGLLayerオブジェクトを 作 成 し そのプロパティを 設 定 します パフォーマンスを 最 適 化 するために レイヤのopaqueプロパティの 値 をYESに 設 定 します 詳 細 については Core Animation 合 成 のパフォーマンスに 注 意 する (79 ページ)を 参 照 してくださ い 必 要 な 場 合 は 値 の 新 しいディクショナリをCAEAGLLayerオブジェクトのdrawableProperties プロパティに 割 り 当 てて レンダリングサーフェスのサーフェスプロパティを 設 定 します レン ダバッファのピクセルフォーマットを 指 定 したり Core Animationに 送 信 した 後 にレンダバッファ のコンテンツを 破 棄 するかどうかを 指 定 したりできます 設 定 可 能 なキーの 一 覧 については EAGLDrawable Protocol Reference を 参 照 してください 2. OpenGL ESコンテキストを 割 り 当 てて そのコンテキストを 現 在 のコンテキストに 設 定 します 詳 細 については OpenGL ESコンテキストの 設 定 (19 ページ)を 参 照 してください 3. ( 上 記 の オフスクリーンフレームバッファオブジェクトの 作 成 (35 ページ)と 同 様 に)フレー ムバッファオブジェクトを 作 成 します 4. 色 レンダバッファを 作 成 し コンテキストのrenderbufferStorage:fromDrawable:メソッドを 呼 び 出 してストレージを 割 り 当 て レイヤオブジェクトをパラメータとして 渡 します 幅 高 さ ピクセルフォーマットはレイヤから 取 得 し レンダバッファにストレージを 割 り 当 てるため に 使 用 します GLuint colorrenderbuffer; glgenrenderbuffers(1, &colorrenderbuffer); glbindrenderbuffer(gl_renderbuffer, colorrenderbuffer); [mycontext renderbufferstorage:gl_renderbuffer fromdrawable:myeagllayer]; glframebufferrenderbuffer(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorrenderbuffer); 注 意 : Core Animationレイヤの 境 界 矩 形 またはプロパティが 変 化 した 場 合 アプリケー ションはレンダバッファのストレージを 再 割 り 当 てする 必 要 があります レンダバッ ファを 再 割 り 当 てしないと レンダバッファのサイズがレイヤのサイズと 合 致 しませ ん この 場 合 Core Animationは 画 像 のコンテンツがレイヤにきちんと 収 まるよう 拡 大 縮 小 することがあります 5. 色 レンダバッファの 高 さと 幅 を 取 得 します GLint width; GLint height; 38
39 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトへの 描 画 glgetrenderbufferparameteriv(gl_renderbuffer, GL_RENDERBUFFER_WIDTH, &width); glgetrenderbufferparameteriv(gl_renderbuffer, GL_RENDERBUFFER_HEIGHT, &height); 前 出 の 各 例 では バッファのストレージを 割 り 当 てるため レンダバッファの 幅 と 高 さが 明 示 的 に 指 定 されていました この 例 では ストレージが 割 り 当 てられた 後 コードによって 色 レンダ バッファから 幅 と 高 さを 取 得 しています アプリケーションがこのようにするのは 色 レンダ バッファの 実 際 の 寸 法 がレイヤの 境 界 矩 形 と 倍 率 に 基 づいて 計 算 されるためです フレームバッ ファにアタッチされるほかのレンダバッファも 同 じ 寸 法 でなければなりません 深 度 バッファを 割 り 当 てるために 高 さと 幅 を 使 用 するほか OpenGL ESビューポートの 割 り 当 てるためと アプ リケーションのテクスチャとモデルで 必 要 な 詳 細 レベルの 決 定 に 役 立 てるために 幅 と 高 さを 使 用 します 詳 細 については 高 解 像 度 ディスプレイのサポート (49 ページ)を 参 照 してくださ い 6. 深 度 バッファを 割 り 当 ててアタッチします( 前 述 のとおり) 7. フレームバッファの 完 全 性 をテストします( 前 述 のとおり) 8. CAEAGLLayerオブジェクトを 表 示 レイヤのaddSublayer:メソッドに 渡 すことによって Core Animationレイヤ 階 層 に 追 加 します フレームバッファオブジェクトへの 描 画 フレームバッファオブジェクトを 作 成 したら 次 にそのオブジェクトを 埋 める 必 要 があります この 節 では 新 しいフレームをレンダリングしてユーザに 表 示 するために 必 要 な 手 順 を 説 明 します テク スチャまたはオフスクリーンのフレームバッファへのレンダリングは 同 じように 行 われますが アプ リケーションが 最 終 フレームを 使 用 する 方 法 だけが 異 なります オンデマンドまたはアニメーションループでのレンダリング GLKit ViewおよびView Controllerで 描 画 するときのように Core Animationレイヤをレンダリングする ときにOpenGL ESコンテンツを 描 画 するタイミングを 選 択 する 必 要 があります オフスクリーンフレー ムバッファまたはテクスチャにレンダリングする 場 合 それらの 種 類 のフレームバッファを 使 用 する 状 況 に 適 しているときは 常 に 描 画 します オンデマンドの 描 画 では 独 自 の 描 画 メソッドを 実 装 してレンダバッファを 表 示 し 新 しいコンテン ツを 表 示 するたびにそのメソッドを 呼 び 出 します 39
40 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトへの 描 画 アニメーションループを 使 用 して 描 画 するには CADisplayLinkオブジェクトを 使 用 します ディス プレイリンクはCore Animationによって 提 供 される 一 種 のタイマで 描 画 と 画 面 のリフレッシュレー トを 同 期 化 できます リスト 4-1 (40 ページ)では ビューを 表 示 されている 画 面 を 取 得 し その 画 面 を 使 用 して 新 たなディスプレイリンクオブジェクトを 作 成 し そのディスプレイリンクオブジェ クトを 実 行 ループに 追 加 する 方 法 を 示 しています 注 意 : GLKViewControllerクラスは GLKViewコンテンツをアニメーションするために CADisplayLinkオブジェクトの 使 用 を 自 動 化 します CADisplayLinkクラスを 直 接 使 用 す るのは GLKitフレームワークの 提 供 内 容 を 超 えて 動 作 する 必 要 がある 場 合 のみです リスト 4-1 ディスプレイリンクの 作 成 と 開 始 displaylink = [myview.window.screen displaylinkwithtarget:self selector:@selector(drawframe)]; [displaylink addtorunloop:[nsrunloop currentrunloop] formode:nsdefaultrunloopmode]; drawframeメソッドの 実 装 内 部 で ディスプレイリンクのtimestampプロパティを 読 み 取 って レン ダリングする 次 のフレームのタイムスタンプを 取 得 します アプリケーションはその 値 を 使 用 して 次 のフレームのオブジェクトの 位 置 を 計 算 できます 通 常 ディスプレイリンクオブジェクトは 画 面 がリフレッシュするごとに 作 動 します リフレッ シュの 値 は 通 常 60Hzですが デバイスによって 異 なる 可 能 性 があります ほとんどのアプリケーショ ンは 画 面 を1 秒 間 に60 回 更 新 する 必 要 はありません ディスプレイリンクのframeIntervalプロパ ティは メソッドが 呼 び 出 される 前 に 経 過 する 実 際 のフレーム 数 に 設 定 することができます たとえ ば フレームの 間 隔 が3に 設 定 される 場 合 アプリケーションは3フレームごとに 呼 び 出 され 1 秒 あ たりおよそ20フレームが 表 示 されます 40
41 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトへの 描 画 Important: 最 良 の 結 果 を 得 るためには アプリケーションが 一 貫 して 達 成 可 能 なフレームレート を 選 びます スムーズで 一 貫 したフレームレートは 一 貫 性 のないフレームレートの 場 合 よりも より 快 適 なユーザ 体 験 を 提 供 します フレームのレンダリング 図 4-3は フレームをレンダリングし 表 示 するためにiOS 上 でOpenGL ESアプリケーションがとるべ き 手 順 を 示 します この 手 順 には アプリケーションのパフォーマンスを 向 上 させるヒントが 多 く 含 まれています 図 4-3 iosにおけるopenglのレンダリング 手 順 バッファの 消 去 各 フレームの 始 まりに 次 のフレームの 描 画 には 必 要 のない 前 のフレームのコンテンツが 含 まれる すべてのフレームバッファアタッチメントのコンテンツを 消 去 します glclear 関 数 を 呼 び 出 して 消 去 するすべてのバッファについてビットマスクを 渡 します(リスト 4-2を 参 照 ) リスト 4-2 フレームバッファアタッチメントの 消 去 glbindframebuffer(gl_framebuffer, framebuffer); glclear(gl_depth_buffer_bit GL_COLOR_BUFFER_BIT); レンダバッファまたはテクスチャの 既 存 のコンテンツは 破 棄 できるというOpenGL ESに 対 するglClear のヒントを 使 用 して 以 前 のコンテンツをメモリに 読 み 込 むという 負 担 のかかる 操 作 を 回 避 します 41
42 その 他 のレンダリング 先 への 描 画 フレームバッファオブジェクトへの 描 画 リソースの 準 備 と 描 画 コマンドの 実 行 この2つのステップは アプリケーションのアーキテクチャ 設 計 時 における 重 要 な 判 断 に 関 係 しま す まず 画 面 に 何 を 表 示 するか 決 め 対 応 するOpenGL ESオブジェクト( 頂 点 バッファオブジェク ト テクスチャ シェイダプログラム 入 力 変 数 など)をGPUにアップロードするための 設 定 をしま す 次 に リソースをどのように 使 ってフレームをレンダリングするか GPUに 指 示 する 描 画 コマン ドを 実 行 します レンダラの 設 計 について 詳 しくは OpenGL ES 設 計 ガイドライン (52 ページ)を 参 照 してくださ い 今 のところ パフォーマンス 最 適 化 における 最 も 重 要 な 点 は 新 しいフレームのレンダリング 開 始 時 にpenGL ESオブジェクトを 修 正 する 場 合 だけ アプリケーションの 実 行 が 高 速 化 するということ です アプリケーションは オブジェクトの 修 正 と 描 画 コマンドの 実 行 を 交 互 に 行 う( 図 4-3 (41 ペー ジ)に 点 線 で 示 した 部 分 )ことができますが アプリケーションは 各 手 順 を1 度 だけ 実 行 する 場 合 に より 高 速 に 実 行 されます 描 画 コマンドの 実 行 この 手 順 は 前 の 手 順 で 作 成 されたオブジェクトを 取 得 し これらオブジェクトを 使 用 する 描 画 コマ ンドを 送 信 します レンダリングコードのこの 部 分 が 効 率 よく 実 行 されるよう 設 計 する 方 法 は OpenGL ES 設 計 ガイドライン (52 ページ)で 詳 しく 説 明 しています 今 のところ パフォーマンス 最 適 化 における 最 も 重 要 な 点 は 新 しいフレームのレンダリング 開 始 時 にpenGL ESオブジェクトを 修 正 する 場 合 だけ アプリケーションの 実 行 が 高 速 化 するということです アプリケーションは オブ ジェクトの 修 正 と 描 画 コマンドの 送 信 を 交 互 に 行 う( 点 線 で 示 した 部 分 )ことができますが アプリ ケーションは 各 手 順 を1 度 だけ 実 行 する 場 合 に より 高 速 に 実 行 されます マルチサンプル 機 能 のリゾルブ アプリケーションは マルチサンプル 機 能 を 使 用 して 画 像 品 質 を 改 善 する 場 合 ユーザに 表 示 される 前 にピクセルをリゾルブしなければなりません マルチサンプル 機 能 については マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 (43 ページ)で 詳 しく 説 明 しています 不 要 なレンダバッファの 破 棄 破 棄 操 作 は 1つ 以 上 のレンダバッファのコンテンツが 不 要 になったことをOpenGL ESに 伝 達 するパ フォーマンス 上 のヒントです レンダバッファのコンテンツが 不 要 になったというというヒントを OpenGL ESに 伝 達 することにより バッファ 内 のデータを 破 棄 することができたり バッファのコン テンツを 更 新 し 続 けるという 負 担 のかかるタスクを 回 避 できたりします レンダリングループのこの 段 階 では アプリケーションは フレームに 対 するすべての 描 画 コマンド の 送 信 が 完 了 しています アプリケーションが 画 面 に 表 示 するための 色 レンダバッファを 必 要 とし ている 間 は 深 度 バッファのコンテンツを 必 要 としていない 可 能 性 があります リスト 4-3は 深 度 バッファのコンテンツを 破 棄 します 42
43 その 他 のレンダリング 先 への 描 画 マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 リスト 4-3 深 度 フレームバッファの 破 棄 const GLenum discards[] = {GL_DEPTH_ATTACHMENT}; glbindframebuffer(gl_framebuffer, framebuffer); gldiscardframebufferext(gl_framebuffer,1,discards); 注 意 : gldiscardframebufferext 関 数 は OpenGL ES 1.1および2.0のEXT_discard_framebuffer 拡 張 機 能 によって 提 供 されます OpenGL ES 3.0のコンテキストでは glinvalidateframebuffer 関 数 を 代 わりに 使 用 します Core Animationへの 結 果 の 表 示 この 手 順 の 段 階 では 色 レンダバッファがレンダリングの 完 了 したフレームを 保 持 しています その ため 必 要 なことはフレームをユーザに 表 示 することだけです リスト 4-4 (43 ページ)は レン ダバッファをコンテキストにバインドし レンダバッファを 表 示 します これにより レンダリング の 完 了 したフレームをCore Animationに 渡 すことができます リスト 4-4 レンダリングの 完 了 したフレームの 表 示 glbindrenderbuffer(gl_renderbuffer, colorrenderbuffer); [context presentrenderbuffer:gl_renderbuffer]; デフォルトでは レンダバッファのコンテンツは アプリケーションがレンダバッファを 表 示 した 後 は 破 棄 されることを 前 提 としなければなりません これは アプリケーションがフレームを 表 示 する たびに フレームのコンテンツを 完 全 に 作 成 し 直 して 新 しいフレームをレンダリングしなければなら ないことを 意 味 します こうした 理 由 から 上 記 のコードは 常 に 色 バッファを 消 去 します アプリケーションがフレーム 間 の 色 レンダバッファのコンテンツを 維 持 する 必 要 のある 場 合 は keagldrawablepropertyretainedbackingキーをcaeagllayerオブジェクトのdrawableproperties プロパティに 格 納 されるディクショナリに 追 加 し 前 のglClear 関 数 呼 び 出 しから GL_COLOR_BUFFER_BIT 定 数 を 削 除 します 保 持 されているバッキングは バッファのコンテンツを 維 持 するため 追 加 のメモリの 割 り 当 てをiOSに 求 める 場 合 があり これによりアプリケーションのパ フォーマンスが 低 下 する 可 能 性 があります マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 マルチサンプル 機 能 は アンチエイリアスの1つの 形 式 で ほとんどの3Dアプリケーションでギザギ ザのエッジを 滑 らかにしたり 画 質 を 向 上 させたりします OpenGL ES 3.0は 中 核 仕 様 の 一 部 として マルチサンプル 機 能 を 備 えています OpenGL ES 1.1および2.0では iosは APPLE_framebuffer_mul- 43
44 その 他 のレンダリング 先 への 描 画 マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 tisample 拡 張 機 能 によってこれを 提 供 します マルチサンプル 機 能 では 使 用 されるメモリ 量 が 多 く 画 層 をレンダリングするフラグメント 処 理 時 間 もかかりますが 他 の 方 法 よりも 低 いパフォーマ ンス 上 の 負 担 で 画 質 を 向 上 させることができる 可 能 性 があります 図 4-4に マルチサンプル 機 能 が 働 く 仕 組 みを 示 します アプリケーションはフレームバッファオブ ジェクトを 1 個 ではなく2 個 作 成 します マルチサンプル 機 能 バッファには コンテンツのレンダリ ングに 必 要 なすべてのアタッチメント( 一 般 的 には 色 バッファと 深 度 バッファ)が 含 まれています リゾルブバッファには ユーザにレンダリング 画 像 を 表 示 するために 必 要 なアタッチメント( 一 般 的 には 色 レンダバッファですが テクスチャの 可 能 性 もあります)のみが 含 まれ フレームバッファ オブジェクトの 生 成 (34 ページ)に 示 す 適 切 な 手 順 で 作 成 されます マルチサンプルレンダバッ ファは リゾルブフレームバッファと 同 じ 寸 法 を 使 用 して 割 り 当 てられますが それぞれのマルチサ ンプルレンダバッファには 各 ピクセルについて 格 納 するサンプル 数 を 指 定 する 追 加 のパラメータが 含 まれます アプリケーションは マルチサンプルバッファへのレンダリングすべてを 実 行 した 後 バッファのサンプルをリゾルブバッファへリゾルブすることによって アンチエイリアス 化 された 最 終 画 像 を 生 成 します 図 4-4 マルチサンプル 機 能 の 仕 組 み リスト 4-5は マルチサンプルバッファを 作 成 するコードを 示 しています このコードは 以 前 に 作 成 したバッファの 幅 と 高 さを 使 用 し glrenderbufferstoragemultisampleapple 関 数 を 呼 び 出 し て レンダバッファ 用 にマルチサンプル 化 されたストレージを 作 成 します リスト 4-5 マルチサンプルバッファの 作 成 glgenframebuffers(1, &sampleframebuffer); glbindframebuffer(gl_framebuffer, sampleframebuffer); glgenrenderbuffers(1, &samplecolorrenderbuffer); glbindrenderbuffer(gl_renderbuffer, samplecolorrenderbuffer); glrenderbufferstoragemultisampleapple(gl_renderbuffer, 4, GL_RGBA8_OES, width, height); glframebufferrenderbuffer(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, samplecolorrenderbuffer); 44
45 その 他 のレンダリング 先 への 描 画 マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 glgenrenderbuffers(1, &sampledepthrenderbuffer); glbindrenderbuffer(gl_renderbuffer, sampledepthrenderbuffer); glrenderbufferstoragemultisampleapple(gl_renderbuffer, 4, GL_DEPTH_COMPONENT16, width, height); glframebufferrenderbuffer(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, sampledepthrenderbuffer); if (glcheckframebufferstatus(gl_framebuffer)!= GL_FRAMEBUFFER_COMPLETE) to make complete framebuffer object %x", glcheckframebufferstatus(gl_framebuffer)); マルチサンプル 機 能 をサポートするレンダリングコードの 修 正 手 順 を 次 に 示 します 1. バッファ 消 去 の 手 順 では マルチサンプルフレームバッファのコンテンツを 消 去 します glbindframebuffer(gl_framebuffer, sampleframebuffer); glviewport(0, 0, framebufferwidth, framebufferheight); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); 2. 描 画 コマンドを 送 信 した 後 マルチサンプルバッファのコンテンツをリゾルブバッファへとリゾ ルブします 各 ピクセルについて 格 納 されたサンプルは リゾルブバッファにおいて1つのサン プルに 結 合 されます glbindframebuffer(gl_draw_framebuffer_apple, resolveframebuffer); glbindframebuffer(gl_read_framebuffer_apple, sampleframebuffer); glresolvemultisampleframebufferapple(); 3. 破 棄 の 手 順 では マルチサンプルフレームバッファにアタッチされている 両 方 のレンダバッファ を 破 棄 できます これは 表 示 しようとするコンテンツがリゾルブバッファに 格 納 されているた めです const GLenum discards[] = {GL_COLOR_ATTACHMENT0,GL_DEPTH_ATTACHMENT}; gldiscardframebufferext(gl_read_framebuffer_apple,2,discards); 4. 結 果 表 示 の 手 順 では リゾルブフレームバッファにアタッチされている 色 レンダバッファを 表 示 します 45
46 その 他 のレンダリング 先 への 描 画 マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 glbindrenderbuffer(gl_renderbuffer, colorrenderbuffer); [context presentrenderbuffer:gl_renderbuffer]; マルチサンプル 機 能 は 負 担 を 伴 わないわけではありません 追 加 のサンプルを 格 納 するには 追 加 のメ モリが 必 要 となり リゾルブフレームバッファへのサンプルのリゾルブには 時 間 がかかります マル チサンプル 機 能 をアプリケーションに 追 加 する 場 合 は パフォーマンスが 許 容 できる 水 準 を 維 持 でき るよう アプリケーションのパフォーマンスを 必 ずテストしてください 注 意 : 上 記 のコードは OpenGL ES 1.1または2.0のコンテキストを 前 提 としています マル チサンプル 機 能 はOpenGL ES 3.0のコアAPIの 一 部 ですが 関 数 はさまざまです 詳 細 につい ては 仕 様 を 参 照 してください 46
47 マルチタスク 高 解 像 度 iosのその 他 の 機 能 OpenGL ESでの 作 業 の 多 くの 側 面 はプラットフォームに 依 存 しませんが ios 上 でのOpenGL ESの 使 用 の 細 部 には 特 別 な 配 慮 が 必 要 です 特 に OpenGL ESを 使 用 するiOSアプリケーションは マルチタス クを 正 しく 処 理 したり バックグラウンドに 移 動 すると 終 了 するリスクに 対 処 したりする 必 要 があり ます iosデバイス 向 けのOpenGL ESコンテンツを 開 発 するときは 表 示 解 像 度 やその 他 のデバイス 機 能 も 考 慮 する 必 要 があります マルチタスク 対 応 OpenGL ESアプリケーションの 実 装 アプリケーションは ユーザが 別 のアプリケーションに 切 り 替 えても 実 行 し 続 けることができます iosにおけるマルチタスクの 概 要 については App States and Multitasking を 参 照 してください OpenGL ESアプリケーションは バックグラウンドに 移 動 したときに 追 加 の 作 業 を 実 行 しなければな りません アプリケーションがこれらの 作 業 を 適 切 に 処 理 しない 場 合 代 わりにiOSがそのアプリケー ションを 終 了 する 可 能 性 があります さらに アプリケーションは OpenGL ESリソースを 解 放 して それらのリソースをフォアグラウンドのアプリケーションが 利 用 できるようにすることもできます バックグラウンドのアプリケーションはグラフィックスハードウェアのコ マンドを 実 行 しない 場 合 がある OpenGL ESアプリケーションは グラフィックスハードウェアでOpenGL ESコマンドを 実 行 しようとす ると 終 了 します tiosはバックグラウンドアプリケーションがグラフィックスプロセッサにアクセ スするのを 阻 止 するため Frontmostアプリケーションはユーザにとって 常 に 使 いやすいものになり ます アプリケーションは バックグラウンドでOpenGL ESを 呼 び 出 したときだけでなく すでに 送 信 されたコマンドがバックグラウンドでGPUにフラッシュされた 場 合 にも 終 了 する 可 能 性 がありま す アプリケーションは バックグラウンドに 移 動 する 前 に すでに 送 信 されたすべてのコマンドが 実 行 を 完 了 しているようにしなければなりません GLKit ViewとView Controllerを 使 用 し 描 画 メソッドでOpenGL ESコマンドを 送 信 するだけの 場 合 ア プリケーションはバックグラウンドに 移 動 すると 自 動 的 に 正 しく 動 作 します GLKViewController クラスは デフォルトでは アプリケーションがアクティブでなくなったときにアニメーションタイ マを 一 時 停 止 します これにより 描 画 メソッドが 呼 び 出 されなくなります 47
48 マルチタスク 高 解 像 度 iosのその 他 の 機 能 マルチタスク 対 応 OpenGL ESアプリケーションの 実 装 GLKit ViewまたはView Controllerを 使 用 しない 場 合 やGLKView 描 画 メソッド 以 外 でOpenGL ESコマンドを 送 信 する 場 合 は 次 の 手 順 を 行 ってアプリケーションがバックグラウンドで 終 了 しないようにしま す 1. アプリケーションデリゲートのapplicationWillResignActive:メソッドにおいて アプリケー ションがアニメーションタイマーを 停 止 し(タイマーがある 場 合 ) アプリケーションを 基 地 の 適 切 な 状 態 に 置 いた 後 glfinish 関 数 を 呼 び 出 します 2. アプリケーションデリゲートのapplicationDidEnterBackground:メソッドにおいて OpenGL ES オブジェクトの 一 部 を 削 除 することで メモリとリソースをフォアグラウンドアプリケーション が 利 用 できるようにすることもできます glfinish 関 数 を 呼 び 出 して リソースがただちに 削 除 されるようにします 3. アプリケーションがapplicationDidEnterBackground:メソッドを 終 了 した 後 は 新 たなOpenGL ES 呼 び 出 しを 行 ってはなりません アプリケーションがOpenGL ES 呼 び 出 しを 行 った 場 合 は ios によってアプリケーションが 終 了 されます 4. アプリケーションのapplicationWillEnterForeground:メソッドでは オブジェクトを 作 成 し 直 して アニメーションタイマーを 再 始 動 します 要 約 すると アプリケーションは すでに 送 信 されたコマンドすべてがコマンドバッファから 取 り 出 され OpenGL ESによって 実 行 されるようにするために glfinish 関 数 を 呼 び 出 す 必 要 があるという ことです アプリケーションがバックグラウンドに 移 動 した 後 フォアグラウンドに 戻 るまでの 間 は OpenGL ESの 使 用 を 一 切 回 避 しなければなりません 作 成 し 直 したリソースをバックグラウンドに 移 動 する 前 に 簡 単 に 削 除 アプリケーションは バックグラウンドに 移 動 するとき OpenGL ESオブジェクトを 解 放 する 必 要 は まったくありません 通 常 アプリケーションはコンテンツの 破 棄 を 避 ける 必 要 があります 次 の2 つのシナリオについて 考 えてみます ユーザがゲームをプレイしていて 少 しの 間 ゲームを 抜 けて カレンダーをチェックします ユーザがゲームに 戻 ると ゲームのリソースはメモリ 内 に 存 在 したままで ゲームをすぐに 再 開 できます ユーザが 別 のOpenGL ESアプリケーションを 起 動 して OpenGL ESアプリケーションがバックグラ ウンドの 状 態 にあります ユーザが 後 から 起 動 したOpenGL ESアプリケーションが デバイス 上 の 空 きメモリより 多 くのメモリを 必 要 とする 場 合 バックグラウンドのアプリケーションは 追 加 の 作 業 の 実 行 を 要 求 されることなく 音 を 出 さず 自 動 的 に 終 了 します 正 常 に 動 作 するようにアプリケーションを 設 計 することを 目 標 とすべきです つまり フォアグラウ ンドへの 移 動 にかかる 時 間 をできるだけ 短 くしながら バックグラウンドに 移 動 している 間 はメモリ 占 有 量 を 減 らす 必 要 があります 48
49 マルチタスク 高 解 像 度 iosのその 他 の 機 能 高 解 像 度 ディスプレイのサポート 次 は 上 記 の2つのシナリオに 対 する 対 処 方 法 です アプリケーションは テクスチャやモデルなどのアセットをメモリに 保 持 します 再 作 成 に 時 間 のかかるリソースは アプリケーションがバックグラウンドへ 移 動 するときに 破 棄 しないように します アプリケーションは すばやく 簡 単 に 再 作 成 できるオブジェクトを 破 棄 しなければなりません 大 量 のメモリを 消 費 するオブジェクトを 探 します 破 棄 しやすいターゲットは レンダリング 結 果 を 保 持 するためにアプリケーションが 割 り 当 てるフ レームバッファです アプリケーションがバックグラウンドにある 場 合 そのアプリケーションは ユーザからは 見 えず OpenGL ESを 使 用 して 新 しいコンテンツをレンダリングする 可 能 性 はありませ ん これは アプリケーションのフレームバッファが 消 費 するメモリが 割 り 当 てられているのに 役 に 立 っていないことを 意 味 します さらに フレームバッファのコンテンツは 一 時 的 なものです ほ とんどのアプリケーションは 新 しいフレームをレンダリングするごとにフレームバッファのコンテ ンツを 作 成 し 直 します このため レンダバッファはメモリを 大 量 に 消 費 する 簡 単 に 再 作 成 可 能 な リソースとなり アプリケーションがバックグラウンドに 移 動 するときに 破 棄 できるオブジェクトの ちょうどよい 候 補 となります GLKit ViewとView Controllerを 使 用 する 場 合 アプリケーションがバックグラウンドに 移 動 すると GLKViewControllerクラスはその 関 連 するビューのフレームバッファを 自 動 的 に 破 棄 します ほか で 使 用 するためにフレームバッファを 手 動 で 作 成 した 場 合 は アプリケーションがバックグラウンド に 移 動 したときに それらを 破 棄 する 必 要 があります いずれの 場 合 も そのときにアプリケーショ ンが 破 棄 できる 他 の 一 時 的 なリソースも 考 慮 する 必 要 があります 高 解 像 度 ディスプレイのサポート デフォルトでは GLKit ViewのcontentScaleFactorプロパティはそれが 含 まれる 画 面 の 倍 率 に 一 致 するため それに 関 連 するフレームバッファは 最 大 解 像 度 の 表 示 でのレンダリング 用 に 設 定 されま す UIKitで 高 解 像 度 ディスプレイをサポートする 方 法 の 詳 細 については Supporting High-Resolution Screens In Views を 参 照 してください Core Animationを 使 用 してOpenGL ESコンテンツを 表 示 する 場 合 倍 率 はデフォルトでは1.0に 設 定 さ れます Retinaディスプレイの 最 大 解 像 度 で 描 画 するには 画 面 の 倍 率 に 合 わせてCAEAGLLayerオブ ジェクトの 倍 率 を 変 更 する 必 要 があります 高 解 像 度 ディスプレイを 備 えたハードウェアをサポートするときは それに 応 じてアプリケーション のモデルおよびテクスチャアセットも 調 整 する 必 要 があります 高 解 像 度 デバイスで 実 行 するとき は より 詳 細 なモデルやテクスチャを 選 んで より 高 画 質 な 画 像 をレンダリングすることができま す 逆 に 標 準 解 像 度 デバイス 上 では 小 さなモデルとテクスチャを 使 用 できます 49
50 マルチタスク 高 解 像 度 iosのその 他 の 機 能 高 解 像 度 ディスプレイのサポート Important: 多 くのOpenGL ES APIは 画 面 ピクセルの 明 確 な 寸 法 を 呼 び 出 します 1.0よりも 大 き い 倍 率 を 使 用 する 場 合 は glscissor glblitframebuffer gllinewidth glpointsize 関 数 またはgl_PointSizeシェーダ 変 数 を 使 用 するとき それに 応 じて 寸 法 を 調 整 する 必 要 がありま す 高 解 像 度 ディスプレイをサポートする 方 法 を 決 める 際 の 重 要 な 要 素 として パフォーマンスがありま す Retinaディスプレイの 倍 率 を2 倍 にすると ピクセル 数 は4 倍 になり GPUは4 倍 のフラグメントを 処 理 するようになります アプリケーションがフラグメント 単 位 の 計 算 を 多 く 実 行 している 場 合 ピ クセル 数 の 増 加 によりフレームレートが 下 がる 可 能 性 があります 高 い 倍 率 ではアプリケーションの 実 行 が 極 端 に 遅 くなるようであれば 次 の 選 択 肢 を 検 討 してください この 文 書 のパフォーマンスチューニングガイドラインを 使 用 して フラグメントシェーダのパ フォーマンスを 最 適 化 する よりシンプルなアルゴリズムをフラグメントシェーダに 実 装 する これにより 個 々のピクセル の 品 質 を 下 げて 画 像 全 体 をより 高 い 解 像 度 でレンダリングします 1.0と 画 面 の 倍 率 の 間 の 倍 率 を 設 定 する 1.5の 倍 率 は 1.0の 倍 率 よりも 品 質 は 高 くなりますが 2.0に 拡 大 された 画 像 よりも 塗 りつぶしに 必 要 なピクセル 数 は 少 なくて 済 みます GLKViewオブジェクトのdrawableColorFormatおよびdrawableDepthFormatプロパティに 対 し て 精 度 の 低 い 形 式 を 使 用 する これによって 基 盤 となるレンダバッファ 上 で 操 作 するために 必 要 なメモリ 帯 域 幅 を 減 らします 低 い 倍 率 を 使 用 し マルチサンプル 機 能 を 有 効 にする さらなる 利 点 として マルチサンプル 機 能 は 高 解 像 度 ディスプレイをサポートしていないデバイス 上 で より 高 い 品 質 がもたらされるこ とが 挙 げられます GLKViewオブジェクトのマルチサンプル 機 能 を 有 効 にするには そのdrawableMultisampleプロ パティの 値 を 変 更 します GLKit Viewへのレンダリングを 行 わない 場 合 は マルチサンプル 機 能 バッファを 手 動 で 設 定 し 最 終 画 像 の 表 示 前 にそれらを 解 決 する 必 要 があります( マルチサンプ ル 機 能 の 使 用 による 画 像 品 質 の 向 上 (43 ページ)を 参 照 ) マルチサンプル 機 能 は 負 担 を 伴 わないわけではありません 追 加 のサンプルを 格 納 するには 追 加 のメモリが 必 要 となり リゾルブフレームバッファへのサンプルのリゾルブには 時 間 がかかりま す マルチサンプル 機 能 をアプリケーションに 追 加 する 場 合 は パフォーマンスが 許 容 できる 水 準 を 維 持 できるよう アプリケーションのパフォーマンスを 必 ずテストしてください 50
51 マルチタスク 高 解 像 度 iosのその 他 の 機 能 デバイスの 向 きに 応 じた 調 整 デバイスの 向 きに 応 じた 調 整 他 のアプリケーションと 同 様 に OpenGL ESアプリケーションがそのコンテンツに 適 切 なデバイスの 向 きをサポートする 必 要 があります supportedinterfaceorientationsメソッドを 使 用 して ア プリケーションの 情 報 プロパティリスト またはOpenGL ESコンテンツをホストしているView Controller で アプリケーションに 対 してサポートされているデバイスの 向 きを 宣 言 します ( 詳 細 について は View Controller Programming Guide for ios を 参 照 ) デフォルトでは GLKViewControllerおよびGLKViewクラスは 向 きの 変 更 を 自 動 的 に 処 理 します ユーザがサポートされている 向 きにデバイスを 回 転 すると 向 きの 変 更 がアニメーション 化 され View Controllerのビューのサイズが 変 更 されます サイズが 変 わると GLKViewオブジェクトはそれに 応 じてそのフレームバッファとビューポートのサイズを 調 整 します この 変 更 に 対 応 する 必 要 がある 場 合 は GLKViewControllerサブクラスのviewWillLayoutSubviewsまたはviewDidLayoutSubviews メソッドを 実 装 するか カスタムGLKViewサブクラスを 使 用 している 場 合 は layoutsubviewsメソッ ドを 実 装 します Core Animationレイヤを 使 用 してOpenGL ESコンテンツを 描 画 する 場 合 は ユーザデバイスの 向 きを 管 理 するためにアプリケーションにView Controllerを 含 める 必 要 があります 外 部 ディスプレイへのOpenGL ESコンテンツの 表 示 iosデバイスは 外 部 ディスプレイにアタッチできます 外 部 ディスプレイの 解 像 度 とコンテンツの 倍 率 は メイン 画 面 とは 異 なる 可 能 性 があります フレームをレンダリングするコードで 適 合 するよ う 調 整 する 必 要 があります 外 部 ディスプレイへの 描 画 手 順 は メイン 画 面 に 描 画 する 場 合 とほとんど 同 じです 1. Multiple Display Programming Guide for iosの 手 順 に 従 って 外 部 ディスプレイにウインドウを 作 成 します 2. レンダリング 方 法 に 適 したビューまたはView Controllerオブジェクトをウインドウに 追 加 します GLKitでレンダリングする 場 合 は GLKViewControllerおよびGLKView(またはカスタムサブ クラス)のインスタンスを 設 定 し そのrootViewControllerプロパティを 使 用 してそれら をウインドウに 追 加 します Core Animationレイヤへのレンダリングを 行 う 場 合 レイヤがウインドウのサブビューとして 含 まれるビューを 追 加 します レンダリングにアニメーションループを 使 用 する 場 合 は ウ インドウのscreenプロパティを 取 得 し displaylinkwithtarget:selector:メソッドを 呼 び 出 して 外 部 ディスプレイに 対 して 最 適 化 されたディスプレイリンクオブジェクトを 作 成 します 51
52 OpenGL ES 設 計 ガイドライン ここまで iosアプリケーションにopengl ESを 組 み 込 むための 基 本 事 項 を 説 明 したので この 章 で は 高 い 処 理 性 能 を 発 揮 するレンダリングエンジンの 設 計 に 役 立 つ 事 項 を 解 説 します レンダラの 設 計 に 関 する 重 要 な 概 念 をこの 章 で 取 り 上 げ 以 降 の 章 ではさらに よりよい 設 計 技 法 や 性 能 改 善 の ための 技 術 を 紹 介 します OpenGL ESを 視 覚 化 する 方 法 この 節 では OpenGL ESの 設 計 を 思 い 描 けるよう クライアント/サーバアーキテクチャとパイプライ ンという 2つの 概 念 を 取 り 上 げます いずれも アプリケーションのアーキテクチャを 計 画 評 価 する 上 で 有 用 な 概 念 です クライアント/サーバアーキテクチャとしてのOpenGL ES 図 6-1に OpenGL ESをクライアント/サーバアーキテクチャとして 表 した 図 を 示 します アプリケー ションは 状 態 変 化 テクスチャや 頂 点 のデータ レンダリングコマンドを OpenGL ESクライアン トとの 間 でやり 取 りします クライアントはこれを グラフィックスハードウェアが 認 識 できる 形 式 に 変 換 し GPUに 転 送 します この 処 理 はアプリケーションの 描 画 性 能 に 対 するオーバーヘッドにな ります 図 6-1 OpenGL ESのクライアント/サーバアーキテクチャ 処 理 性 能 を 改 善 するためには このオーバーヘッドをうまく 管 理 しなければなりません 適 切 に 設 計 されたアプリケーションは OpenGL ESに 対 する 呼 び 出 しの 頻 度 を 落 とし ハードウェアにとって 適 切 なデータ 形 式 を 採 用 して 変 換 の 負 荷 を 抑 え OpenGL ESとの 間 でやり 取 りするデータの 流 れを 注 意 深 く 管 理 します 52
53 OpenGL ES 設 計 ガイドライン OpenGL ESを 視 覚 化 する 方 法 グラフィックスパイプラインとしてのOpenGL ES 図 6-2に OpenGL ESをグラフィックスパイプラインとして 表 した 図 を 示 します アプリケーションは グラフィックスパイプラインを 構 成 し 描 画 コマンドを 実 行 して 頂 点 データをパイプラインに 送 り 込 みます パイプラインとして 連 続 している 各 ステージでは 頂 点 シェーダが 頂 点 データを 処 理 し これをプリミティブとしてまとめ ラスタライズしてフラグメントにし フラグメントシェーダが 各 フラグメントの 色 や 深 度 を 計 算 し これをフレームバッファにブレンドして 最 終 的 な 表 示 に 到 りま す 図 6-2 OpenGL ESグラフィックスパイプライン アプリケーションがどのようにしてフレームを 生 成 しているのか 思 い 浮 かべるためのモデルとして パイプラインを 使 うとよいでしょう レンダラの 設 計 も これに 応 じていくつかに 分 けておこないま す すなわち シェーダプログラム(パイプラインの 頂 点 ステージやフラグメントステージを 処 理 ) を 記 述 し このプログラムに 送 り 込 む 頂 点 データやテクスチャデータを 編 成 し パイプラインの 固 定 機 能 ステージを 駆 動 するようOpenGL ESの 状 態 機 械 を 設 定 する という 分 割 です グラフィックスパイプラインの 各 ステージは それぞれの 計 算 処 理 を 同 時 に 実 行 できます たとえ ば アプリケーションが 新 しいプリミティブを 用 意 している 間 に グラフィックスハードウェアの 独 立 した 各 部 分 が それまでに 送 り 込 まれたジオメトリデータをもとに 頂 点 やフラグメントの 計 算 を 進 めるのです もっとも 後 のステージの 処 理 は 前 のステージの 出 力 に 依 存 します パイプライン のいずれかの 段 階 の 作 業 量 が 多 すぎる 場 合 または 作 業 の 実 行 に 時 間 がかかりすぎている 場 合 ほか のパイプラインは 最 も 時 間 のかかっている 段 階 が 作 業 を 完 了 するまでの 間 アイドル 状 態 となりま す グラフィックスハードウェアの 能 力 に 応 じ パイプラインの 各 ステージの 処 理 量 が 均 衡 していれ ば よい 設 計 ということになります 53
54 OpenGL ES 設 計 ガイドライン OpenGL ESの 版 とレンダラのアーキテクチャ Important: アプリケーションのパフォーマンスをチューニングする 場 合 最 初 の 手 順 は 通 常 ア プリケーションのボトルネックとなっている 段 階 とその 理 由 を 特 定 することです OpenGL ESの 版 とレンダラのアーキテクチャ iosには3つの 版 のOpenGL ESが 搭 載 されています 新 しい 版 ほど 適 合 性 が 高 く 高 画 質 の 視 覚 効 果 を 実 現 するレンダリングアルゴリズムを 処 理 性 能 を 損 なうことなく 実 装 できるようになっています OpenGL ES 3.0 OpenGL ES 3.0はiOS 7で 新 たに 導 入 された 版 です その 機 能 を 駆 使 して 従 来 はデスクトップ 機 やゲー ムコンソールでしか 実 現 できなかった 高 度 なグラフィックスプログラミング 技 法 を 実 装 し 高 いグ ラフィック 性 能 と 卓 越 した 視 覚 効 果 を 生 み 出 すことができます OpenGL ES 3.0の 目 玉 となる 機 能 をいくつか 取 り 上 げて 紹 介 します そのほかの 機 能 については OpenGL ES 3.0 Specification (OpenGL ES API Registryで 公 開 )を 参 照 してください OpenGL ESのシェーディング 言 語 ( 第 3.0 版 ) GLSL ES 3.0には ユニフォームブロック 32ビット 整 数 追 加 の 整 数 演 算 などの 新 機 能 が 加 わってお り 頂 点 シェーダやフラグメントシェーダで より 汎 用 的 な 計 算 処 理 を 実 行 できるようになりまし た 新 しい 言 語 でシェーダプログラムを 記 述 するためには ソースコードの 先 頭 に #version 330 es という 記 述 子 が 必 要 です OpenGL ES 3.0のコンテキストは OpenGL ES 2.0 用 に 記 述 したシェーダ と 互 換 性 があります 詳 しくは OpenGL ESシェーディング 言 語 の 第 3.0 版 に 移 行 する (124 ページ) および OpenGL ES Shading Language 3.0 Specification (OpenGL ES API Registryで 公 開 )を 参 照 してください 多 重 レンダターゲット 多 重 レンダターゲットを 有 効 にすると 複 数 のフレームバッファアタッチメントに 同 時 に 書 き 込 む フラグメントシェーダを 実 装 できます この 機 能 を 利 用 して 遅 延 シェーディングのような 高 度 なレンダリングアルゴリズムを 実 装 できま す 一 連 のテクスチャをレンダリングしてジオメトリデータを 保 存 しておき このテクスチャを 読 み 込 んだ 後 光 源 を 計 算 して 最 終 的 な 画 像 を 出 力 する シェーディングパスをいくつか 実 行 するという アルゴリズムです この 方 式 では 入 力 を 事 前 に 計 算 した 上 で 光 源 を 計 算 するため 多 数 の 光 源 が 54
55 OpenGL ES 設 計 ガイドライン OpenGL ESの 版 とレンダラのアーキテクチャ あっても 計 算 負 荷 はそれほど 増 えません 遅 延 シェーディングのアルゴリズムを 実 装 し 充 分 な 処 理 性 能 を 引 き 出 すためには 多 重 レンダターゲットの 機 能 が 不 可 欠 です( 図 6-3を 参 照 ) これがなけ れば 多 数 のテクスチャをレンダリングするため それぞれ 独 立 した 描 画 パスが 必 要 になります 図 6-3 フラグメントシェーダが 多 重 レンダターゲットに 出 力 する 様 子 フレームバッファオブジェクトの 生 成 (34 ページ)で 説 明 した 処 理 に 加 え 多 重 レンダターゲッ トを 用 意 します フレームバッファ 用 の 色 アタッチメントを 1つでなく 必 要 な 数 だけ 生 成 します 次 にglDrawBuffers 関 数 で どのフレームバッファアタッチメントをレンダリングに 使 うか 指 定 しま す(リスト 6-1を 参 照 ) リスト 6-1 多 重 レンダターゲットを 用 意 するコード 例 // Attach (previously created) textures to the framebuffer. glframebuffertexture2d(gl_draw_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _colortexture, 0); glframebuffertexture2d(gl_draw_framebuffer, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, _positiontexture, 0); glframebuffertexture2d(gl_draw_framebuffer, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, _normaltexture, 0); 55
56 OpenGL ES 設 計 ガイドライン OpenGL ESの 版 とレンダラのアーキテクチャ glframebuffertexture2d(gl_draw_framebuffer, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depthtexture, 0); // Specify the framebuffer attachments for rendering. GLenum targets[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; gldrawbuffers(3, targets); アプリケーションが 描 画 コマンドを 発 行 すると フラグメントシェーダは 各 レンダターゲットの 各 ピクセルに どの 色 (または 色 以 外 のデータ)を 出 力 するか 判 断 します リスト 6-2に 多 重 ターゲッ トにレンダリングする 基 本 的 なフラグメントシェーダを 示 します 場 所 がリスト 6-1の 設 定 に 合 致 するフラグメント 出 力 変 数 に 代 入 する という 形 で 処 理 します リスト 6-2 多 重 レンダターゲットに 出 力 するフラグメントシェーダのコード 例 #version 300 es uniform lowp sampler2d mytexture; in mediump vec2 texcoord; in mediump vec4 position; in mediump vec3 normal; layout(location = 0) out lowp vec4 colordata; layout(location = 1) out mediump vec4 positiondata; layout(location = 2) out mediump vec4 normaldata; void main() { colordata = texture(mytexture, texcoord); positiondata = position; normaldata = vec4(normalize(normal), 1.0); } 多 重 レンダターゲットは 実 時 間 リフレクション SSAO(Screen-Space Ambient Occlusion 画 面 空 間 のアンビエントオクルージョン) 体 積 光 など 他 の 高 度 なグラフィックス 技 法 にも 有 用 です 56
57 OpenGL ES 設 計 ガイドライン OpenGL ESの 版 とレンダラのアーキテクチャ 変 換 のフィードバック グラフィックスハードウェアは ベクトル 処 理 用 に 最 適 化 した 高 度 に 並 列 化 したアーキテクチャを 使 います このハードウェアに 新 たに 導 入 された 変 換 のフィードバック 機 能 も 活 用 するとよいで しょう 頂 点 シェーダの 出 力 を 取 り 込 んで GPUメモリのバッファオブジェクトに 送 り 込 む 機 能 で す あるレンダリングパスからデータを 取 り 込 んで 別 のパスで 使 う あるいは グラフィックスパイ プラインの 一 部 を 無 効 にし 他 の 一 般 的 な 目 的 に 変 換 のフィードバックを 利 用 することが 可 能 です この 機 能 が 有 用 な 技 術 として アニメーションパーティクル 効 果 があります パーティクル 系 をレン ダリングする 一 般 的 なアーキテクチャを 図 6-4に 示 します アプリケーションはまず パーティクル シミュレーションの 初 期 状 態 を 設 定 します 次 に レンダリングする 各 フレームについてシミュレー ションのステップを 実 行 して 各 対 象 パーティクルの 位 置 や 向 き 速 度 を 更 新 した 後 パーティクル の 現 在 の 状 態 を 表 す 視 覚 アセットを 描 画 します 図 6-4 パーティクル 系 アニメーションの 概 要 従 来 パーティクル 系 を 実 装 するアプリケーションは CPU 側 でシミュレーションを 実 行 して 結 果 を 頂 点 バッファに 格 納 し パーティクルアートのレンダリングに 使 っていました しかし 頂 点 バッ ファの 内 容 をGPUメモリに 転 送 する 処 理 には 時 間 がかかります 変 換 のフィードバック 機 能 を 利 用 す れば 現 代 的 なGPUハードウェアが 備 える 並 列 処 理 アーキテクチャを 駆 使 して より 効 率 的 に 問 題 を 解 くことができます この 方 針 にもとづき 実 際 にレンダリングエンジンを 設 計 してみましょう 図 6-5に OpenGL ESのグ ラフィックスパイプラインを 利 用 して パーティクル 系 アニメーションを 実 装 する 方 法 の 概 要 を 示 し ます OpenGL ESは 個 々のパーティクルやその 状 態 を 頂 点 として 表 現 するので GPUの 頂 点 シェーダ 57
58 OpenGL ES 設 計 ガイドライン OpenGL ESの 版 とレンダラのアーキテクチャ ステージでは いくつかのパーティクルに 対 して 同 時 にシミュレーションを 実 行 できます パーティ クルの 状 態 データを 格 納 する 頂 点 バッファはフレーム 間 で 共 用 できるので データをGPUメモリに 転 送 するという 負 荷 の 高 い 処 理 は 初 期 化 の 際 に 一 度 起 こるだけです 図 6-5 変 換 のフィードバック 機 能 を 利 用 するグラフィックスパイプラインの 構 成 例 1. 初 期 化 の 際 に 頂 点 バッファを 生 成 し シミュレーション 対 象 のパーティクルすべてについて 初 期 状 態 データを 格 納 します 2. GLSL 頂 点 シェーダプログラムでパーティクルのシミュレーションをおこない フレームごとに パーティクルの 位 置 データを 格 納 した 頂 点 バッファの 内 容 を 描 画 します 変 換 のフィードバック 機 能 を 有 効 にした 状 態 でレンダリングするため glbegintransformfeedback 関 数 を 実 行 します(その 後 glendtransformfeedback()を 呼 び 出 してから 通 常 の 描 画 処 理 を 実 行 ) gltransformfeedbackvaryings 関 数 で 変 換 のフィードバック 機 能 がどのシェーダ 出 力 を 取 り 込 むかを 指 定 します また glbindbufferbase 関 数 またはglBindBufferRange 関 数 と GL_TRANSFORM_FEEDBACK_BUFFERというバッファ 型 を 使 って 取 り 込 み 先 のバッファを 指 定 します ラスタ 化 (およびパイプラインの 後 続 ステージ)を 無 効 にするため glenable(gl_rasterizer_discard)を 実 行 します 58
59 OpenGL ES 設 計 ガイドライン 高 パフォーマンスなOpenGL ESアプリケーションの 設 計 3. シミュレーション 結 果 を 反 映 して 実 際 にレンダリングするため パーティクルの 位 置 を 格 納 した 頂 点 バッファを 第 2の 描 画 パスに 送 り 込 みます ラスタ 化 (およびパイプラインの 後 続 ステージ) を 再 び 有 効 にし アプリケーションの 視 覚 コンテンツのレンダリングに 適 した 頂 点 シェーダやフ ラグメントシェーダを 使 います 4. 次 のフレームのシミュレーションでは 直 前 のフレーム 用 に 計 算 した 頂 点 バッファ 出 力 を 入 力 と して 使 います 変 換 のフィードバック 機 能 を 有 効 に 利 用 できる 他 のグラフィックスプログラミング 技 法 として スケ ルタルアニメーション(あるいはスキニング)やレイマーチングがあります OpenGL ES 2.0 OpenGL ES 2.0には プログラマブルシェーダを 備 えた 適 応 性 の 高 いグラフィックスパイプラインがあ り 現 行 のどのiOSデバイスでも 動 作 します iosデバイスでは OpenGL ES 3.0の 仕 様 で 正 式 に 導 入 さ れた 機 能 の 多 くが OpenGL ES 2.0でも 拡 張 機 能 として 使 えるようになっています したがって 多 く のデバイスとの 互 換 性 を 保 ちながら 高 度 なグラフィックスプログラミング 技 術 を 実 装 できます OpenGL ES 1.1 OpenGL ES 1.1は 基 本 的 な 固 定 機 能 グラフィックスパイプラインのみを 提 供 します iosは 主 として 後 方 互 換 性 を 維 持 するためにOpenGL ES 1.1を 搭 載 しています OpenGL ES 1.1 用 のアプリケーションを 保 守 している 場 合 新 しい 版 のOpenGL ESに 合 わせて 更 新 することも 検 討 してください GLKitフレームワークには OpenGL ES 1.1の 固 定 機 能 パイプラインを 新 しい 版 に 移 行 するための 支 援 機 能 があります 詳 しくは GLKitを 使 用 したレンダラの 開 発 (32 ページ)を 参 照 してください 高 パフォーマンスなOpenGL ESアプリケーションの 設 計 簡 潔 に 言 うと しっかりした 設 計 のOpenGL ESアプリケーションは 以 下 を 行 う 必 要 があります OpenGL ESパイプラインで 並 行 処 理 を 活 用 する アプリケーションとグラフィックスハードウェアとの 間 のデータの 流 れを 管 理 する 59
60 OpenGL ES 設 計 ガイドライン 高 パフォーマンスなOpenGL ESアプリケーションの 設 計 図 6-6は 画 面 に 表 示 するアニメーションをOpenGL ESを 使 用 して 実 行 するアプリケーションにおける プロセスの 流 れを 示 しています 図 6-6 リソース 管 理 のためのアプリケーションモデル アプリケーションが 起 動 して 最 初 に 実 行 するのは アプリケーションの 実 行 中 に 変 更 するつもりのな いリソースの 初 期 化 です こうしたリソースは アプリケーションがOpenGL ESオブジェクトにカプ セル 化 することが 理 想 です 目 標 は アプリケーションの 実 行 中 (または ゲーム 内 のあるレベルの 期 間 など アプリケーション 実 行 における 一 部 の 期 間 )に 変 更 しないままにできるオブジェクトを 作 成 し 初 期 化 にかかる 時 間 の 増 加 と 引 き 替 えにレンダリングパフォーマンスを 向 上 させることです 複 雑 なコマンドまたは 状 態 の 変 更 は 単 一 の 関 数 呼 び 出 しで 使 用 可 能 なOpenGL ESオブジェクトに 置 き 換 える 必 要 があります たとえば 固 定 機 能 パイプラインの 設 定 には 多 くの 関 数 呼 び 出 しを 要 す る 可 能 性 があります その 代 わりに 初 期 化 時 にグラフィックスシェーダをコンパイルし 単 一 の 関 数 呼 び 出 しの 実 行 時 にグラフィックスシェーダに 切 り 替 えます 作 成 や 修 正 に 負 荷 が 生 じるOpenGL ES オブジェクトは ほとんどの 場 合 静 的 オブジェクトとして 作 成 します レンダリングループは OpenGL ESコンテキストにレンダリングするすべての 項 目 を 処 理 し その 結 果 を 画 面 に 表 示 します アニメーション 化 されたシーンでは 一 部 のデータがフレームごとに 更 新 さ れます 図 6-6に 示 す 内 側 のレンダリングループでは アプリケーションは レンダリングリソース の 更 新 (プロセス 内 のOpenGL ESオブジェクトの 作 成 または 修 正 )と レンダリングリソースを 使 用 する 描 画 コマンドの 送 信 とを 交 互 に 実 行 します この 内 側 のループの 目 標 は CPUとGPUが 並 行 して 60
61 OpenGL ES 設 計 ガイドライン 高 パフォーマンスなOpenGL ESアプリケーションの 設 計 処 理 を 行 い アプリケーションとOpenGL ESが 同 時 に 同 じリソースにアクセスすることのないよう 作 業 負 荷 のバランスをとることです iosでは OpenGL ES オブジェクトの 修 正 は 修 正 がフレーム の 最 初 と 最 後 に 実 行 されない 場 合 負 荷 が 高 くなる 可 能 性 があります この 内 側 のループの 重 要 な 目 標 は OpenGL ESからアプリケーションに 再 びデータがコピーされるの を 避 けることです GPUからCPUへの 結 果 のコピーは 非 常 に 時 間 がかかる 可 能 性 があります 中 央 の レンダリングループに 示 すように コピーされたデータが 現 在 のフレームのレンダリングプロセス の 一 部 として 後 で 使 用 される 場 合 アプリケーションは それまでに 送 信 されたすべての 描 画 コマン ドが 完 了 するまでブロックされます アプリケーションは フレームで 必 要 なすべての 描 画 コマンドを 送 信 した 後 結 果 を 画 面 に 表 示 しま す インタラクティブではないアプリケーションは その 後 の 処 理 のために 最 終 画 像 をアプリケー ションが 保 有 するメモリにコピーします 最 後 に アプリケーションが 終 了 する 準 備 ができているとき またはアプリケーションが 主 要 なタス クを 完 了 したとき アプリケーションはOpenGL ESオブジェクトを 解 放 し そのアプリケーション 自 身 またはほかのアプリケーションのために さらにリソースが 利 用 できるようにします この 設 計 の 特 性 の 重 要 な 点 をまとめると 次 のようになります 実 用 的 な 場 合 は 必 ず 静 的 リソースを 作 成 する 内 側 のレンダリングループは 動 的 リソースの 修 正 とレンダリングコマンドの 送 信 を 交 互 に 実 行 する フレームの 最 初 と 最 後 を 除 き 動 的 リソースの 修 正 を 避 けるようにする 中 間 のレンダリング 結 果 がアプリケーションに 読 み 取 りに 戻 らないようにする この 章 の 残 りでは このレンダリングループ 機 能 の 実 装 に 役 立 つ OpenGL ESのプログラミングテク ニックを 紹 介 します この 後 の 章 では 次 に 示 す 汎 用 テクニックをOpenGL ESプログラミングの 特 定 の 領 域 に 適 用 する 方 法 について 説 明 します 同 期 とフラッシュの 操 作 の 回 避 (62 ページ) OpenGL ESの 状 態 照 会 の 回 避 (63 ページ) OpenGL ESを 使 用 したリソースの 管 理 (63 ページ) ダブルバッファリングによるリソースの 競 合 の 回 避 (63 ページ) OpenGL ESの 状 態 に 注 意 を 払 う (65 ページ) OpenGL ESのオブジェクトで 状 態 をカプセル 化 する (66 ページ) 61
62 OpenGL ES 設 計 ガイドライン 同 期 とフラッシュの 操 作 の 回 避 同 期 とフラッシュの 操 作 の 回 避 OpenGL ESの 仕 様 では すぐにコマンドを 実 行 するための 実 装 は 不 要 です 多 くの 場 合 コマンドは コマンドバッファのキューに 追 加 され 後 でハードウェアが 実 行 します 通 常 OpenGL ESはアプリ ケーションがハードウェアにコマンドを 送 信 する 前 に 多 くのコマンドをキューに 追 加 するまで 待 ちま す 通 常 はバッチ 処 理 を 使 用 するとより 効 率 的 です ただし 一 部 のOpenGL ES 関 数 は コマンドバッ ファをすぐにフラッシュしなければなりません それ 以 外 の 関 数 は コマンドバッファをフラッシュ するだけでなく アプリケーションの 制 御 を 返 す 前 に それまでに 送 信 されたコマンドが 完 了 するま でブロックされます フラッシュコマンドと 同 期 コマンドを 使 用 するのは その 挙 動 が 必 要 な 場 合 の みです フラッシュコマンドや 同 期 コマンドを 使 いすぎると ハードウェアによるレンダリングが 完 了 するのを 待 っている 間 にアプリケーションが 停 止 する 可 能 性 があります 次 に 示 す 状 況 では OpenGL ESは 実 行 に 備 えコマンドバッファをハードウェアに 送 信 する 必 要 があ ります glflush 関 数 が コマンドバッファをグラフィックスハードウェアに 送 信 するとき この 関 数 は コマンドがハードウェアに 送 信 されるまでブロックされますが コマンドの 実 行 完 了 までは 待 ち ません glfinish 関 数 がコマンドバッファをフラッシュし それまでに 送 信 されたすべてのコマンドがグ ラフィックスハードウェアで 実 行 し 終 わるのを 待 っているとき フレームバッファコンテンツを 取 得 する 関 数 (glreadpixelsなど)も 送 信 されたコマンドが 完 了 するのを 待 っているとき コマンドバッファが 一 杯 になっているとき glflushの 効 果 的 な 使 用 いくつかのデスクトップOpenGL 実 装 では CPUとGPUの 作 業 のバランスを 効 率 的 にとるために glflush 関 数 を 定 期 的 に 呼 び 出 すと 役 に 立 つ 場 合 がありますが これはiOSには 当 てはまりません iosのグラフィックスハードウェアによって 実 装 されるタイルベースの 遅 延 レンダリングアルゴリズ ムは シーン 内 のすべての 頂 点 データの 即 時 バッファリングに 依 存 するため 非 表 示 のサーフェスの 削 除 に 対 して 最 適 に 処 理 されます 通 常 OpenGL ESアプリケーションがglFlushまたはglFinish 関 数 を 呼 び 出 す 必 要 がある 状 況 は2つだけです アプリケーションがバックグラウンドに 移 動 するときは コマンドバッファをフラッシュする 必 要 があります アプリケーションがバックグラウンドにあるときにGPU 上 でOpenGL ESコマンドを 実 行 すると iosがアプリケーションを 終 了 させるからです ( マルチタスク 対 応 OpenGL ESアプ リケーションの 実 装 (47 ページ)を 参 照 ) 複 数 のコンテキスト 間 でアプリケーションがOpenGL ESオブジェクト( 頂 点 バッファやテクスチャ など)を 共 有 する 場 合 は glflush 関 数 を 呼 び 出 してこれらのリソースへのアクセスを 同 期 させ る 必 要 があります たとえば 頂 点 データのコンテンツが 別 のコンテンツによって 取 得 される 準 62
63 OpenGL ES 設 計 ガイドライン OpenGL ESを 使 用 したリソースの 管 理 備 ができているようにするには その 頂 点 データを1つのコンテキストにロードした 後 glflush 関 数 を 呼 び 出 す 必 要 があります このアドバイスは OpenGL ESオブジェクトをCore Imageなどの 他 のiOS APIと 共 有 するときにも 該 当 します OpenGL ESの 状 態 照 会 の 回 避 glget*()(glgeterror()を 含 む)を 呼 び 出 すと OpenGL ESでは 状 態 変 数 を 取 得 する 前 にそれ 以 前 のコマンドが 実 行 されなければならない 可 能 性 があります このような 同 期 化 のために グラフィッ クスハードウェアとCPUが 間 を 置 かずに 実 行 されなければならないため 並 行 処 理 の 機 会 が 減 ります これを 避 けるには 照 会 する 必 要 のある 状 態 のコピーを 保 持 し OpenGL ESを 呼 び 出 すのではなく コピーに 直 接 アクセスします エラーが 発 生 すると OpenGL ESはエラーフラグを 設 定 します これらのエラーやその 他 のエラーは XcodeのOpenGL ES Frame DebuggerまたはInstrumentsのOpenGL ES Analyzerに 表 示 されます glgeterror 関 数 は 呼 び 出 し 頻 度 が 高 い 場 合 にはパフォーマンスを 低 下 させるため 代 わりにこれらのツールを 使 用 する 必 要 があります glcheckframebufferstatus() glgetprograminfolog() glvalidateprogram()などの 他 の 照 会 が 役 立 つのも 一 般 には 開 発 中 やデバッグ 中 のみです アプ リケーションのリリースビルドではこれらの 関 数 の 呼 び 出 しを 省 くべきです OpenGL ESを 使 用 したリソースの 管 理 多 くのOpenGLデータは OpenGL ESレンダリングコンテキストとそれに 関 連 付 けられた 共 有 グループ オブジェクト 内 に 直 接 格 納 できます OpenGL ESの 実 装 は グラフィックスハードウェアに 最 適 な 形 式 にデータを 自 由 に 変 換 できます これにより 更 新 頻 度 が 低 いデータの 場 合 は 特 に パフォーマン スが 大 幅 に 向 上 する 可 能 性 があります アプリケーションは データがどのように 使 用 されるのかに ついて OpenGL ESに 対 するヒントも 提 供 します OpenGL ESの 実 装 では これらのヒントを 使 用 し て データをより 効 率 的 に 処 理 できます たとえば 静 的 データは グラフィックス 専 用 のメモリも 含 め グラフィックスプロセッサが 簡 単 にフェッチできるメモリに 配 置 できます ダブルバッファリングによるリソースの 競 合 の 回 避 リソースの 競 合 は アプリケーションとOpenGL ESが あるOpenGL ESオブジェクトに 同 時 にアクセス するときに 発 生 します 一 方 の 当 事 者 (アプリケーションまたはOpenGL ES)が 使 用 中 のOpenGL ESオ ブジェクトをもう 一 方 の 当 事 者 が 修 正 しようとすると 両 者 はそのオブジェクトが 使 用 できなくなる までブロックされる 可 能 性 があります オブジェクトの 修 正 が 開 始 されると もう 一 方 の 当 事 者 は 修 正 が 完 了 するまでそのオブジェクトにアクセスできません あるいは OpenGL ESが 暗 黙 的 にオブジェ クトを 複 製 して 両 方 の 当 事 者 がコマンドの 実 行 を 継 続 できるようにする 場 合 があります どちらの 方 法 も 安 全 ですが どちらもアプリケーションのボトルネックとなるおそれがあります 図 6-7はこ 63
64 OpenGL ES 設 計 ガイドライン ダブルバッファリングによるリソースの 競 合 の 回 避 の 問 題 を 示 しています この 例 では 単 一 のテクスチャオブジェクトがあり そのオブジェクトを OpenGL ESとアプリケーションの 両 方 が 使 用 しようとしています アプリケーションがテクスチャを 変 更 しようとすると そのアプリケーションは それまで 送 信 された 描 画 コマンドが 完 了 するまで つまりCPUとGPUが 同 期 するまで 待 たなければなりません 図 6-7 単 一 のバッファに 格 納 されたテクスチャデータ この 問 題 を 解 決 するため アプリケーションは オブジェクトの 変 更 とオブジェクトに 関 連 する 描 画 との 間 で 追 加 の 作 業 を 実 行 することができます しかし 実 行 可 能 な 追 加 の 作 業 がアプリケーション にない 場 合 アプリケーションは 同 じサイズの2つのオブジェクトを 明 示 的 に 作 成 します これによ り 一 方 の 当 事 者 がオブジェクトを 読 み 取 っている 間 もう 一 方 が 残 りのオブジェクトを 修 正 できま す 図 6-8に ダブルバッファによるアプローチを 示 します GPUがあるテクスチャを 処 理 している 64
65 OpenGL ES 設 計 ガイドライン OpenGL ESの 状 態 に 注 意 を 払 う 間 CPUが 別 のテクスチャを 修 正 するという 方 法 です 最 初 に 起 動 した 後 は CPUもGPUもアイドル 状 態 です テクスチャを 例 にとりましたが この 方 法 はほとんどの 種 類 のOpenGL ESオブジェクトで 機 能 します 図 6-8 ダブルバッファリングされたテクスチャデータ ダブルバッファリングはほとんどのアプリケーションで 有 効 ですが 両 方 の 当 事 者 がほぼ 同 時 にコマ ンドの 処 理 を 完 了 する 必 要 があります ブロック 状 態 を 回 避 するため さらにバッファを 追 加 するこ とができます この 場 合 は 従 来 のプロデューサ/コンシューマモデルが 実 装 されます コンシュー マがコマンド 処 理 を 完 了 する 前 にプロデューサが 処 理 を 完 了 した 場 合 プロデューサはアイドルバッ ファを 利 用 してコマンドの 処 理 を 継 続 します この 状 況 では プロデューサは コンシューマの 処 理 が 著 しく 遅 れる 場 合 のみアイドル 状 態 になります ダブルバッファリングやトリプルバッファリングには パイプラインが 停 止 するのを 防 げる 代 わり に メモリの 消 費 量 が 増 えるというトレードオフがあります メモリの 使 用 量 が 増 えると アプリ ケーションのほかの 部 分 に 負 担 がかかる 可 能 性 があります iosデバイスでは メモリは 貴 重 なリソー スです 設 計 において メモリの 使 用 量 を 増 やすことと ほかのアプリケーションの 最 適 化 とのバラ ンスをとる 必 要 があります OpenGL ESの 状 態 に 注 意 を 払 う OpenGL ESの 実 装 では 多 種 多 様 な 状 態 データ 群 を 管 理 します glenable 関 数 やglDisable 関 数 によ るスイッチの 状 態 現 在 のシェーダプログラムおよびそのユニフォーム 変 数 現 在 バインドしている テクスチャユニット 現 在 バインドしている 頂 点 バッファおよびその 有 効 な 頂 点 属 性 などです ハー 65
66 OpenGL ES 設 計 ガイドライン OpenGL ESの 状 態 に 注 意 を 払 う ドウェアも 現 在 の 状 態 を1つ 保 持 しており これを 集 約 して 遅 延 キャッシュするようになっています 状 態 の 切 り 替 えは 負 荷 がかかるため 状 態 の 切 り 替 えを 最 小 限 に 抑 えたアプリケーションを 設 計 する ことが 最 も 推 奨 されます すでに 設 定 済 みの 状 態 は 設 定 しないでください ある 機 能 を 一 度 有 効 化 したら 再 び 有 効 化 する 必 要 はありません たとえば 同 じ 引 数 を 指 定 してglUniform 関 数 を 複 数 回 呼 び 出 した 場 合 同 じユニ フォーム 状 態 が 設 定 済 みかどうか OpenGL ESが 確 認 するとは 限 りません OpenGL ESは 現 在 の 値 と 同 じ 値 の 場 合 は 単 にその 状 態 値 で 更 新 するだけです 状 態 を 設 定 する 呼 び 出 しを 描 画 ループ 内 に 配 置 するのではなく 専 用 のセットアップルーチンまたは シャットダウンルーチンを 使 用 することによって 不 要 な 状 態 設 定 を 避 けてください セットアップ ルーチンおよびシャットダウンルーチンは 特 別 な 視 覚 効 果 を 達 成 する 機 能 のオンとオフの 切 り 替 え にも 有 用 です たとえば テクスチャ 化 されたポリゴンのワイヤフレームの 輪 郭 を 描 画 する 場 合 に 便 利 です OpenGL ESのオブジェクトで 状 態 をカプセル 化 する 状 態 変 化 の 頻 度 を 抑 えるため OpenGL ESの 状 態 変 化 を 単 一 のオブジェクトに 集 約 し 1 回 の 関 数 呼 び 出 しでまとめてバインドすることも 考 えられます たとえば 頂 点 配 列 オブジェクトでは 複 数 の 頂 点 属 性 の 設 定 が1つのオブジェクトに 格 納 されます 詳 細 については 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 (92 ページ)を 参 照 してください 描 画 関 数 の 呼 び 出 しを 整 理 して 状 態 変 化 を 最 小 限 に 抑 える OpenGL ESの 状 態 を 変 更 しても すぐには 効 果 が 現 れません 描 画 コマンドを 発 行 してはじめて 新 しい 状 態 にもとづき OpenGL ESが 必 要 な 描 画 処 理 を 実 行 するようになっています 状 態 の 変 更 を 最 小 限 に 抑 えることにより グラフィックスパイプラインの 再 設 定 に 要 するCPU 時 間 を 削 減 できます たとえば 状 態 ベクトルをアプリケーション 側 で 管 理 し 対 応 するOpenGL ESの 状 態 は 次 の 描 画 関 数 呼 び 出 しまでの 間 に 状 態 が 変 化 した 場 合 にのみ 設 定 し 直 すようにするとよいでしょう ほかに 有 用 なアルゴリズムとして 状 態 の 整 列 があります 必 要 な 描 画 操 作 と それぞれのために 必 要 な 状 態 変 更 の 量 を 追 跡 し 同 じ 状 態 で 実 行 する 描 画 操 作 は 連 続 しておこなうよう 並 べ 換 える というもので す iosにおけるopengl ESの 実 装 では 設 定 データの 一 部 をキャッシュすることにより 状 態 を 効 率 よく 切 り 替 えることも 可 能 ですが 個 々の 状 態 集 合 を 最 初 に 設 定 する 処 理 には より 時 間 を 要 します 一 定 の 処 理 性 能 が 得 られるよう 初 期 設 定 の 段 階 で 使 う 予 定 の 状 態 集 合 をそれぞれ 暖 機 運 転 してお くことも 考 えられます 1. 使 う 予 定 の 状 態 設 定 やシェーダを 有 効 にしておきます 2. その 状 態 設 定 で 少 数 の 頂 点 を 描 画 します( 暖 機 運 転 ) 66
67 OpenGL ES 設 計 ガイドライン OpenGL ESの 状 態 に 注 意 を 払 う 3. OpenGL ESのコンテキストをフラッシュして この 間 に 描 画 した 内 容 が 表 示 されないようにしま す 67
68 OpenGL ESアプリケーションのチューニング iosにおけるopengl ESアプリケーションのパフォーマンスは OS Xやその 他 のデスクトップオペレー ティングシステムにおけるOpenGLのパフォーマンスとは 異 なります iosベースのデバイスは 強 力 な 計 算 デバイスですが デスクトップコンピュータやラップトップコンピュータが 持 つメモリやCPUパ ワーは 持 ち 合 わせていません 組 み 込 みのGPUは 典 型 的 なデスクトップやラップトップのGPUとは 異 なるアルゴリズムを 使 用 しており メモリと 電 力 の 使 用 を 抑 えるように 最 適 化 されています グラ フィックスデータのレンダリングが 非 効 率 的 であると フレームレートが 低 下 したり iosベースの デバイスのバッテリー 持 続 時 間 が 著 しく 減 少 したりする 可 能 性 があります 後 の 章 では アプリケーションのパフォーマンスを 向 上 させる 数 多 くのテクニックを 取 り 上 げていま す この 章 では 全 体 的 な 戦 略 について 説 明 します 特 に 注 記 しない 限 り この 章 に 挙 げる 事 項 はどの 版 のOpenGL ESにも 適 用 できます XcodeやInstrumentsで アプリケーションをデバッグ プロ ファイリングする アプリケーションは さまざまなデバイス 上 で さまざまなシナリオに 基 づいてパフォーマンスをテ ストするまでは 最 適 化 しないでください XcodeやInstrumentsには 性 能 を 見 極 め 問 題 点 を 修 正 す るためのツールが 付 属 しています Xcodeのデバッグゲージで 性 能 を 概 観 できます Xcode 上 でアプリケーションを 実 行 すれば この ゲージは 常 に 表 示 されるので 開 発 の 過 程 で 性 能 に 変 化 が 生 じればすぐに 気 がつくでしょう Instrumentsに 付 属 する OpenGL ES AnalysisおよびOpenGL ES Driverというツールで 実 行 時 の 性 能 をさらに 詳 しく 調 べることができます アプリケーションがリソースをどのように 使 っている か OpenGL ESのベストプラクティスに 適 合 しているか といった 詳 しい 情 報 が 得 られます ま た グラフィックスパイプラインの 一 部 を 選 択 的 に 無 効 にすることにより 顕 著 なボトルネック になっている 箇 所 を 判 断 できます 詳 細 については Instruments User Guide を 参 照 してくだ さい Xcodeに 付 属 する OpenGL ES Frame DebuggerおよびPerformance Analyzerというツールで 性 能 やレンダリングに 関 する 問 題 の 箇 所 を 特 定 し 対 処 できます あるフレームのレンダリングおよ び 表 示 に 使 われたOpenGL ESのコマンドをすべて 取 り 込 み OpenGL ESの 状 態 バインドされたリ ソース 出 力 フレームバッファに 対 して 各 コマンドがどのような 効 果 を 及 ぼしているか 確 認 し ます また シェーダのソースコードを 表 示 編 集 し 変 更 を 施 したとき 出 力 画 像 にどんな 変 化 68
69 OpenGL ESアプリケーションのチューニング XcodeやInstrumentsで アプリケーションをデバッグ プロファイリングする が 現 れるか 調 べることも 可 能 です OpenGL ES 3.0 対 応 のデバイスであれば Frame Debugger 上 で レンダリング 時 間 の 多 くを 占 めている 描 画 関 数 やシェーダ 命 令 も 分 かります ツールについ て 詳 しくは Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 (126 ページ)を 参 照 してください XcodeやInstrumentsでOpenGL ESのエラーを 監 視 する APIの 使 い 方 が 誤 っていると OpenGL ESがエラーになります( 基 盤 となるハードウェアが 実 行 できな い 演 算 を 要 求 するなど) コンテンツが 正 しくレンダリングされた 場 合 でも これらのエラーはパ フォーマンス 上 の 問 題 を 示 すことがあります OpenGL ESのエラーをチェックする 従 来 の 方 法 は glgeterror 関 数 を 呼 び 出 すことですが この 関 数 を 繰 り 返 し 呼 び 出 すと パフォーマンスが 大 幅 に 低 下 する 可 能 性 があります 代 わりに 上 記 のツールで 次 のように 調 べてください Instrumentsでアプリケーションをプロファイルすると ツール OpenGL ES Analyzer の 詳 細 ペイ ンが 表 示 され 記 録 中 にレポートされたOpenGL ESのエラーが 表 示 されます Xコードでアプリケーションをデバッグしているときに フレームを 取 り 込 み そのフレームの 生 成 に 使 用 された 描 画 コマンドのほか それらのコマンドの 実 行 中 に 発 生 したエラーを 確 認 する ことができます OpenGL ESエラーの 発 生 時 にプログラムの 実 行 を 停 止 するようにXcodeを 設 定 することもできます ( OpenGL ESのエラーブレークポイントの 追 加 を 参 照 ) 69
70 OpenGL ESアプリケーションのチューニング XcodeやInstrumentsで アプリケーションをデバッグ プロファイリングする 情 報 提 供 のデバッグおよびプロファイル 用 に OpenGL ESのコードに 注 釈 を 付 ける OpenGL ESコマンドを 論 理 的 なグループにまとめ OpenGL ESオブジェクトに 意 味 のあるラベルを 追 加 することによって より 効 率 的 にデバッグとプロファイルを 行 うことができます これらのグループ とラベルは XcodeのOpenGL ES Frame Debugger( 図 7-1を 参 照 )と InstrumentsのOpenGL ES Analyzer に 表 示 されます グループとラベルを 追 加 するには EXT_debug_markerおよびEXT_debug_label 拡 張 機 能 を 使 用 します 図 7-1 デバッグマーカグループの 追 加 前 と 追 加 後 のXcode Frame Debugger 1つの 意 味 のある 演 算 を 表 す 一 連 の 描 画 コマンド(たとえば ゲームのキャラクタの 描 画 など)があ るときは マーカを 使 用 してデバッグ 用 にそれらをグループ 化 することができます リスト 7-1に これらの 関 数 を 使 用 して テクスチャ プログラム 頂 点 配 列 をグループ 化 し シーンの1つの 要 素 に 対 する 呼 び 出 しを 描 画 するコード 例 を 示 します まずglPushGroupMarkerEXT 関 数 で 意 味 のある 名 前 を 与 えた 後 OpenGL ESのコマンド 群 を 実 行 します 最 後 にglPopGroupMarkerEXT 関 数 で 一 連 の コマンドが 終 了 したことを 示 します 70
71 OpenGL ESアプリケーションのチューニング パフォーマンスのための 一 般 的 な 推 奨 事 項 リスト 7-1 デバッグマーカを 使 って 描 画 コマンドに 注 釈 をつけるコード 例 glpushgroupmarkerext(0, "Draw Spaceship"); glbindtexture(gl_texture_2d, _spaceshiptexture); gluseprogram(_diffuseshading); glbindvertexarrayoes(_spaceshipmesh); gldrawelements(gl_triangle_strip, 256, GL_UNSIGNED_SHORT, 0); glpopgroupmarkerext(); 複 数 の 入 れ 子 になったマーカを 使 用 して 複 雑 なシーンに 意 味 のあるグループの 階 層 を 作 成 すること ができます GLKViewクラスを 使 用 してOpenGL ESコンテンツを 描 画 すると すべてのコマンドが 描 画 メソッドに 含 まれる Rendering グループが 自 動 的 に 作 成 されます 作 成 するすべてのマーカが このグループ 内 で 入 れ 子 になります ラベルを 使 用 して テクスチャ シェーダプログラム 頂 点 配 列 オブジェクトなどのOpenGL ESオブ ジェクトに 意 味 のある 名 前 を 付 けることができます gllabelobjectext 関 数 でオブジェクトに 名 前 を 与 え デバッグやプロファイルの 際 に 表 示 されるようにします リスト 7-2に この 関 数 で 頂 点 配 列 オブジェクトにラベル 付 けをするコード 例 を 示 します GLKTextureLoaderクラスを 使 用 してテク スチャデータを 読 み 込 むと それらのファイル 名 で 作 成 されたOpenGL ESテクスチャオブジェクトに 自 動 的 にラベルが 付 けられます リスト 7-2 デバッグラベルを 利 用 してOpenGL ESオブジェクトに 注 釈 をつけるコード 例 glgenvertexarraysoes(1, &_spaceshipmesh); glbindvertexarrayoes(_spaceshipmesh); gllabelobjectext(gl_vertex_array_object_ext, _spaceshipmesh, 0, "Spaceship"); パフォーマンスのための 一 般 的 な 推 奨 事 項 常 識 に 従 って パフォーマンスチューニングの 作 業 を 進 めます たとえば アプリケーションがフ レームごとに 数 十 個 程 度 の 三 角 形 を 描 く 場 合 頂 点 データの 送 信 方 法 を 変 更 するとパフォーマンスが 向 上 する 可 能 性 が 低 くなります 作 業 のパフォーマンスを 最 も 向 上 させる 最 適 化 を 探 します シーンのデータが 変 更 された 場 合 のみシーンを 再 描 画 する アプリケーションは シーン 内 に 何 らかの 変 更 があるまで 新 しいフレームのレンダリングを 待 機 する 必 要 があります Core Animationはユーザに 表 示 された 最 後 の 画 像 をキャッシュし 新 しいフレーム が 表 示 されるまでその 画 像 を 表 示 し 続 けます 71
72 OpenGL ESアプリケーションのチューニング タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う データが 変 化 した 場 合 でも 必 ずしもハードウェアがコマンドを 処 理 するのと 同 じ 速 度 でフレームを レンダリングする 必 要 はありません 一 般 に 高 速 でもフレームレートが 変 動 する 場 合 と 比 べると より 低 速 で 固 定 のフレームレートのほうがユーザには 滑 らかに 見 えます ほとんどのアニメーション では30フレーム/ 秒 の 固 定 フレームレートで 十 分 であり 電 力 消 費 の 削 減 に 役 立 ちます 使 用 しないOpenGL ES 機 能 を 無 効 にする 最 高 の 処 理 性 能 が 得 られるのは アプリケーションが 何 も 計 算 せずに 済 む 場 合 です たとえば 事 前 に 計 算 を 行 って 結 果 をモデルのデータに 格 納 できる 場 合 は アプリケーション 実 行 時 にその 計 算 の 実 行 を 回 避 することができます OpenGL ES 2.0 以 降 向 けにアプリケーションを 記 述 する 場 合 は アプリケーションがシーンのレンダリ ングに 必 要 とする 各 タスクを 実 行 するための 多 数 のスイッチと 条 件 が 設 定 された 単 一 のシェーダを 作 成 しないでください 代 わりに 各 シェーダが 的 を 絞 った 特 定 のタスクを 実 行 する 複 数 のシェー ダプログラムをコンパイルします アプリケーションでOpenGL ES 1.1を 使 用 する 場 合 は シーンのレンダリングに 不 要 な 固 定 機 能 操 作 を 無 効 にします たとえば アプリケーションでライティングやブレンディングが 不 要 な 場 合 は それ らの 機 能 を 無 効 にしてください 同 様 に 2Dモデルのみを 描 画 する 場 合 はフォグと 深 度 テストを 無 効 にします ライティングモデルを 簡 素 化 する これは OpenGL ES 1.1の 固 定 機 能 ライティングと OpenGL ES 2.0 以 降 のカスタムシェーダで 使 用 する シェーダベースのライティング 演 算 の どちらにも 適 用 できるガイダンスです ライティングの 使 用 はできるだけ 控 え アプリケーションにとって 最 もシンプルなタイプのライ ティングを 使 用 します より 多 くの 演 算 が 必 要 となるスポットライティングの 代 わりに 指 向 性 ライトの 使 用 を 検 討 します シェーダは ライティング 演 算 をモデル 空 間 で 行 う 必 要 がありま す より 複 雑 なライティングアルゴリズムではなく よりシンプルなライティング 方 程 式 の 使 用 を 検 討 してください ライティングを 事 前 に 計 算 し フラグメント 処 理 によってサンプリング 可 能 なテクスチャにカ ラー 値 を 保 存 します タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う iosデバイスのgpuはいずれも タイルベースの 遅 延 レンダリング(TBDR Tile-Based Deferred Rendering)を 実 装 しています レンダリングコマンドをハードウェアに 送 信 するためOpenGL ES 関 数 を 呼 び 出 すと これらのコマンドは 一 定 量 のコマンドが 蓄 積 されるまでバッファに 格 納 されます 72
73 OpenGL ESアプリケーションのチューニング タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う ハードウェアが 実 際 に 頂 点 を 処 理 し ピクセルのシェーディングを 始 めるのは レンダバッファを 表 示 するか コマンドバッファをフラッシュしてからです コマンド 群 を 単 一 の 演 算 としてレンダリン グするため フレームバッファをタイルに 分 割 し タイルごとに1 度 だけ 描 画 コマンドを 実 行 します このとき 各 タイルでは その 中 に 現 れるプリミティブのみを 描 画 します(GLKViewクラスは 描 画 メ ソッド 終 了 後 のレンダバッファを 表 します CAEAGLLayerクラスで 表 示 用 に 独 自 のレンダバッファ を 用 意 した 場 合 その 表 示 はOpenGL ESコンテキストのpresentRenderbuffer:メソッドでおこない ます glflush 関 数 やglFinish 関 数 は コマンドバッファの 内 容 をフラッシュします) タイルメモリはGPUハードウェアの 一 部 なので レンダリング 処 理 の 一 部 ( 深 度 のテスト ブレンド など)は 処 理 時 間 の 面 でも 消 費 電 力 の 面 でも 従 来 のストリームベースのGPIアーキテクチャに 比 べ 効 率 よく 動 作 します このアーキテクチャでは シーン 全 体 の 頂 点 を 一 括 処 理 するので フラグ メントの 処 理 に 先 だって 隠 面 除 去 が 可 能 です 表 示 されないピクセルは テクスチャのサンプリング やフラグメント 処 理 を 実 行 せずに 破 棄 されます したがって GPUがタイルをレンダリングするため に 実 行 しなければならない 計 算 量 が 大 幅 に 削 減 されます 従 来 型 のストリームベースのレンダラにとって 有 用 なレンダリング 戦 略 の 中 には iosグラフィック スハードウェアに 対 する 負 荷 が 高 いものがあります 以 下 のガイドラインに 従 えば TBDRハードウェ アで 実 行 したとき 処 理 性 能 の 改 善 に 効 果 があるでしょう 論 理 バッファの 読 み 込 みや 格 納 を 避 ける TBDRグラフィックスプロセッサは タイルのレンダリングを 始 めると まずフレームバッファの 該 当 部 分 の 内 容 を 共 有 メモリから GPUのタイルメモリに 転 送 しなければなりません この 処 理 を 論 理 バッファの 読 み 込 みと 言 いますが 相 当 の 時 間 と 電 力 を 消 費 します 多 くの 場 合 フレームバッファ の 内 容 は 次 のフレームを 描 画 する 際 には 不 要 になります 前 回 のバッファを 読 み 込 むことのないよ う 新 規 フレームのレンダリングを 始 める 際 にはglClear 関 数 を 実 行 してください 同 様 に GPUがタイルのレンダリングを 終 えると そのピクセルデータを 共 有 メモリに 書 き 戻 す 必 要 があります これを 論 理 バッファの 格 納 と 言 いますが やはり 負 荷 の 高 い 処 理 です 描 画 するフレー ムごとに 少 なくとも1 回 はこの 転 送 が 必 要 です 画 面 に 表 示 する 色 レンダバッファを 共 有 メモリに 転 送 して Core Animationが 実 際 に 表 示 できるようにするためです レンダリングアルゴリズムで 使 う 他 のフレームバッファアタッチメント( 深 度 ステンシル マルチサンプリングなどのバッファ) は 次 のフレームを 描 画 する 際 にまた 生 成 されるので 保 存 しておく 必 要 はありません 明 示 的 に 無 効 にしていない 限 り OpenGL ESは 自 動 的 にこういったバッファの 内 容 も 共 有 メモリに 書 き 戻 すよう になっており これも 性 能 向 上 を 妨 げる 要 因 です バッファを 無 効 にするためには OpenGL ES 3.0で あればglInvalidateFramebufferコマンド 1.1や2.0であればglDiscardFramebufferEXTコマンド を 使 います( 詳 しくは 不 要 なレンダバッファの 破 棄 (42 ページ)を 参 照 ) GLKViewクラスが 提 供 する 基 本 的 な 描 画 サイクルを 使 えば 深 度 ステンシル マルチサンプリングのバッファは 自 動 的 に 無 効 になります 73
74 OpenGL ESアプリケーションのチューニング タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う 論 理 バッファの 格 納 や 読 み 込 みは レンダリング 先 を 切 り 替 えたときにも 起 こります レンダリング 先 をテクスチャからビューのフレームバッファに 切 り 替 えた 後 再 び 同 じテクスチャに 切 り 替 える と テクスチャの 内 容 を 共 有 メモリとGPUの 間 で 転 送 する 処 理 が 繰 り 返 し 発 生 します 描 画 演 算 をま とめ 同 じレンダリング 先 への 描 画 は 一 括 しておこなうようにしてください (glbindframebuffer 関 数 glframebuffertexture2d 関 数 binddrawableメソッドで)フレームバッファを 切 り 替 える 際 には 不 要 なフレームバッファアタッチメントを 無 効 にして 論 理 バッファの 格 納 が 起 こらないよ うにしなければなりません 隠 面 除 去 を 効 率 的 に 使 う TBDRグラフィックスプロセッサは 自 動 的 に 深 度 バッファを 使 って シーン 全 体 の 隠 面 除 去 をおこな い ピクセルごとにフラグメントシェーダが1 回 しか 適 用 されないようにしています フラグメント 処 理 を 削 減 する 従 来 の 技 法 は 不 要 になりました たとえば オブジェクトやプリミティブを 深 度 順 に ( 手 前 から 奥 へ) 整 列 する 処 理 は GPUの 処 理 と 実 質 的 に 重 複 し CPU 時 間 を 無 駄 に 消 費 するだけで す ブレンディングやアルファテストが 有 効 になっていれば GPUは 隠 面 除 去 を 実 行 できません フラグ メントシェーダがdiscard 命 令 を 使 っていたり gl_fragdepth 出 力 変 数 に 書 き 込 んでいたりする 場 合 も 同 様 です このような 場 合 深 度 バッファを 調 べるだけではフラグメントが 隠 れているかどうか 判 断 できないので 各 ピクセルを 覆 うプリミティブすべてについてフラグメントシェーダを 実 行 する 必 要 があり フレームのレンダリングに 要 する 時 間 や 消 費 電 力 が 大 幅 に 増 してしまいます これを 避 けるため ブレンディング discard 命 令 深 度 の 書 き 込 みは 最 小 限 に 抑 えるようにしてくださ い ブレンディングやアルファテスト discard 命 令 が 避 けられない 場 合 は できるだけ 性 能 を 損 なわずに 済 むよう 次 の 戦 略 を 検 討 するとよいでしょう オブジェクトを 不 透 明 度 の 順 に 整 列 する 方 法 最 初 に 不 透 明 なオブジェクトを 描 画 します 次 に シェーダがdiscard 命 令 (OpenGL ES 1.1の 場 合 はアルファテストも)を 要 するオブジェクト を 描 画 します 最 後 に アルファブレンドされたオブジェクトを 描 画 します 74
75 OpenGL ESアプリケーションのチューニング タイルベースの 遅 延 レンダリングを 効 率 的 に 使 う ブレンディングやdiscard 命 令 を 要 するオブジェクトをトリミングして 処 理 するフラグメント の 数 を 減 らす 方 法 たとえば 余 白 が 多 い2Dスプライトテクスチャの 場 合 矩 形 ではなく 画 像 にほぼ 外 接 する 多 角 形 を 描 画 します( 図 7-2を 参 照 ) 頂 点 の 処 理 が 若 干 増 えますが 結 果 が 使 われることのないフラグメントシェーダを 実 行 することに 比 べれば 無 視 しても 構 いません 図 7-2 透 明 なオブジェクトをトリミングしてフラグメント 処 理 を 減 らす 様 子 discard 命 令 はフラグメントシェーダの 最 初 の 方 に 配 置 して 結 果 が 使 われることのない 計 算 を 避 けます アルファテストやdiscard 命 令 でピクセルを 破 棄 する 代 わりに 0を 設 定 したアルファとのアル ファブレンディングをおこなう 方 法 があります 色 フレームバッファは 修 正 されませんが グラ フィックスハードウェアは 実 行 するZバッファの 最 適 化 を 引 き 続 き 使 用 できます 深 度 バッファ に 格 納 されている 値 は 変 更 されないため 透 過 プリミティブの 背 面 から 前 面 への 並 べ 替 えが 必 要 となる 可 能 性 があります discard 命 令 が 不 可 欠 であるため 性 能 改 善 に 限 界 がある 場 合 は Z-Prepass レンダリング 技 法 を 検 討 してください 破 棄 ロジックのみを 含 む 単 純 なフラグメントシェーダ(コストのかかるライ ティング 演 算 を 避 ける)を 使 用 してシーンを1 回 レンダリングして 深 度 バッファを 埋 めます 次 に GL_EQUAL 深 度 テスト 関 数 とライティングシェーダを 使 用 してシーンをもう 一 度 レンダリン グします マルチパスレンダリングは 通 常 はパフォーマンスの 低 下 を 招 きますが この 方 法 では 多 数 の 破 棄 操 作 を 伴 うシングルパスレンダリングよりもパフォーマンスが 向 上 する 可 能 性 があり ます OpenGL ESコマンドをグループ 化 して 効 率 的 にリソースを 管 理 する 先 に 説 明 したメモリ 帯 域 幅 と 計 算 量 の 節 約 は 大 きなシーンを 処 理 する 場 合 に 最 も 効 果 があります しかし 小 さいシーンのレンダリングを 要 求 するOpenGL ESコマンドをハードウェアが 受 け 取 ると レンダラの 効 率 は 大 幅 に 低 下 します たとえば テクスチャを 使 ってひとまとまりの 三 角 形 をレンダ 75
76 OpenGL ESアプリケーションのチューニング 描 画 コマンドの 数 を 最 小 限 に 抑 える リングした 後 そのテクスチャを 修 正 する 場 合 OpenGL ESの 実 装 では それらのコマンドをただち にフラッシュするか テクスチャを 複 製 しなければなりませんが どちらもハードウェアを 効 率 よく 使 っているとは 言 えません 同 様 に フレームバッファからピクセルデータを 読 み 込 もうとすると その 前 のコマンドがフレームバッファを 変 更 する 場 合 はそれらが 実 行 されている 必 要 があります このような 性 能 低 下 を 防 ぐため OpenGL ESのコマンド 呼 び 出 しを 整 理 して 同 じレンダターゲット に 対 する 描 画 コマンドは 一 括 して 実 行 できるようにしてください 描 画 コマンドの 数 を 最 小 限 に 抑 える アプリケーションがOpenGL ESで 処 理 するプリミティブを 送 信 するたびに CPUはグラフィックスハー ドウェア 用 のコマンドを 準 備 します シーンをレンダリングするためにglDrawArraysや gldrawelementsを 何 度 も 呼 び 出 していれば GPUを 充 分 に 活 用 できず CPUリソースが 性 能 のボトル ネックになってしまいます このオーバーヘッドを 削 減 するため レンダリング 処 理 を 少 数 の 描 画 呼 び 出 しにまとめられないか 検 討 してください 次 のような 戦 略 が 考 えられます 複 数 のプリミティブを 単 一 の 三 角 形 ストリップにマージする 方 法 ( 三 角 形 ストリップを 使 用 し て 頂 点 データを 一 括 処 理 する (85 ページ)を 参 照 ) 最 良 の 結 果 を 得 るには 近 接 して 描 画 さ れるプリミティブを 整 理 統 合 します 広 範 囲 にわたるモデルの 場 合 フレームに 表 示 されていな い 部 分 をアプリケーションが 効 率 よく 間 引 くのは 難 しくなります テクスチャアトラスを 作 成 し プリミティブごとに 同 じテクスチャ 画 像 の 異 なる 部 分 を 使 って 描 画 する 方 法 ( 複 数 のテクスチャをテクスチャアトラスにまとめる (100 ページ)を 参 照 ) インスタンス 描 画 法 ( 下 記 参 照 )により よく 似 た 多 数 のオブジェクトをレンダリングする 方 法 インスタンス 描 画 法 により 描 画 関 数 の 呼 び 出 し 回 数 を 減 らす インスタンス 描 画 (instanced drawing)コマンドを 使 えば 1 回 の 描 画 関 数 呼 び 出 しで 同 じ 頂 点 デー タを 何 度 でも 描 画 できます 位 置 オフセット 変 換 行 列 色 やテクスチャの 座 標 などに 少 しずつ 違 いがあるメッシュのインスタンスを(CPU 時 間 を 消 費 して) 個 々に 用 意 し それぞれについて 描 画 コ マンドを 実 行 する 代 わりに GPU 側 のシェーダコードで 各 インスタンスを 処 理 するのです 頂 点 データを 何 度 も 使 い 回 しする 状 況 はインスタンス 描 画 法 に 向 いています たとえばリスト 7-3の コードは シーン 内 の 何 箇 所 にも 同 じオブジェクトを 描 画 しています しかし gluniformや gldrawarraysを 何 度 も 実 行 するとCPUに 対 するオーバーヘッドとなり 性 能 低 下 の 原 因 になります 76
77 OpenGL ESアプリケーションのチューニング 描 画 コマンドの 数 を 最 小 限 に 抑 える リスト 7-3 インスタンス 描 画 法 によらずに よく 似 たオブジェクトを 多 数 描 画 するコード 例 for (x = 0; x < 10; x++) { for (y = 0; y < 10; y++) { gluniform4fv(uniformpositionoffset, 1, positionoffsets[x][y]); gldrawarrays(gl_triangles, 0, numvertices); } } インスタンス 描 画 法 を 適 用 するためには2つの 手 順 が 必 要 です まず 先 のコード 例 のようなループ を gldrawarraysinstancedやgldrawelementsinstancedを 一 度 呼 び 出 すだけの 記 述 に 変 更 しま す この 関 数 はglDrawArraysやglDrawElementsとほとんど 同 じですが 描 画 するインスタンスの 数 を 表 す 引 数 が 追 加 されています(リスト 7-3の 例 では100) 次 に インスタンスごとに 異 なる 情 報 を 頂 点 シェーダに 渡 す 方 法 が2 通 りあるので いずれかを 選 んで 実 装 します シェーダインスタンスIDを 使 う 方 式 の 場 合 インスタンスごとの 情 報 は 頂 点 シェーダが 計 算 あるい は 検 索 して 求 めます 組 み 込 み 変 数 gl_instanceidには 頂 点 シェーダを 実 行 する 都 度 描 画 対 象 イ ンスタンスを 識 別 する 番 号 が 入 ります 位 置 オフセット 色 など インスタンスによって 異 なる 値 は シェーダ 側 のコードで この 番 号 をもとに 計 算 し あるいはユニフォーム 配 列 などの 大 容 量 スト レージから 検 索 します リスト 7-4に この 技 法 で10 10の 格 子 上 に100 個 のインスタンスを 描 画 する 例 を 示 します リスト 7-4 OpenGL ES 3.0の 頂 点 シェーダが gl_instanceidをもとに インスタンスによって 異 なる 値 を 計 算 するコード 例 #version 300 es in vec4 position; uniform mat4 modelviewprojectionmatrix; void main() { float xoffset = float(gl_instanceid % 10) * ; float yoffset = float(gl_instanceid / 10) * ; vec4 offset = vec4(xoffset, yoffset, 0, 0); } gl_position = modelviewprojectionmatrix * (position + offset); 77
78 OpenGL ESアプリケーションのチューニング 描 画 コマンドの 数 を 最 小 限 に 抑 える インスタンス 配 列 を 使 う 方 式 では インスタンスによって 異 なる 情 報 を 頂 点 配 列 属 性 に 格 納 しま す 頂 点 シェーダはこの 属 性 にアクセスして インスタンスごとの 情 報 を 取 得 します glvertexattribdivisor 関 数 で OpenGL ESが 各 インスタンスを 描 画 するごとに 当 該 属 性 がどのよ うに 変 化 するかを 指 定 します リスト 7-5にインスタンス 描 画 法 で 使 う 頂 点 配 列 を 用 意 するコード 例 リスト 7-6に 対 応 するシェーダのコード 例 を 示 します リスト 7-5 インスタンスごとに 異 なる 情 報 を 頂 点 属 性 に 格 納 するコード 例 #define kmyinstancedataattrib 5 glgenbuffers(1, &_instbuffer); glbindbuffer(gl_array_buffer, _instbuffer); glbufferdata(gl_array_buffer, sizeof(instdata), instdata, GL_STATIC_DRAW); glenablevertexattribarray(kmyinstancedataattrib); glvertexattribpointer(kmyinstancedataattrib, 2, GL_FLOAT, GL_FALSE, 0, 0); glvertexattribdivisor(kmyinstancedataattrib, 1); リスト 7-6 インスタンス 配 列 を 参 照 して 動 作 するOpenGL ES 3.0の 頂 点 シェーダ #version 300 es layout(location = 0) in vec4 position; layout(location = 5) in vec2 inoffset; uniform mat4 modelviewprojectionmatrix; void main() { vec4 offset = vec4(inoffset, 0.0, 0.0) gl_position = modelviewprojectionmatrix * (position + offset); } インスタンス 描 画 法 はOpenGL ES 3.0のコアAPIに 組 み 込 まれています OpenGL ES 2.0の 場 合 は EXT_draw_instancedおよびEXT_instanced_arraysという 拡 張 機 能 として 実 装 されています 78
79 OpenGL ESアプリケーションのチューニング OpenGL ESのメモリ 消 費 を 最 小 限 に 抑 える OpenGL ESのメモリ 消 費 を 最 小 限 に 抑 える iosアプリケーションは システムおよびほかのiOSアプリケーションとメインメモリを 共 有 します OpenGL ES 用 にメモリを 割 り 当 てると アプリケーションのほかの 部 分 で 使 用 できるメモリが 減 りま す そのことを 念 頭 において 必 要 なメモリだけを 割 り 当 てて 割 り 当 てたメモリが 不 要 になったら できるだけ 早 くそのメモリの 割 り 当 てを 解 除 します メモリを 節 約 する 方 法 をいくつか 紹 介 します 画 像 をOpenGL ESテクスチャにロードした 後 元 の 画 像 を 解 放 する アプリケーションが 必 要 としているときだけ 深 度 バッファを 割 り 当 てる アプリケーションがすべてのリソースを 一 度 に 必 要 としない 場 合 は 項 目 のサブセットだけを ロードします たとえば 1つのゲームを 複 数 のレベルに 分 割 できます 各 レベルは より 厳 し いリソース 制 限 に 収 まる リソース 全 体 のサブセットをロードします iosの 仮 想 メモリシステムは スワップファイルを 使 用 しません メモリ 不 足 の 状 態 が 検 出 されると 仮 想 メモリは 揮 発 性 のページをディスクに 書 き 込 む 代 わりに 不 揮 発 性 メモリを 解 放 して 実 行 中 のア プリケーションに 必 要 なメモリを 提 供 します アプリケーションはメモリの 使 用 をできる 限 り 少 なく する 努 力 をしなければなりません また アプリケーションにとって 必 須 ではないオブジェクトを 破 棄 できるように 備 えておかなければなりません メモリ 不 足 状 態 への 対 応 については ios App Programming Guide で 詳 しく 説 明 しています Core Animation 合 成 のパフォーマンスに 注 意 する Core Animationは レンダバッファのコンテンツをビュー 階 層 に 含 まれるほかのレイヤと 合 成 します 合 成 されるレイヤは OpenGL ES Quartz またはそのほかのグラフィックスライブラリのいずれで 描 画 されたかは 関 係 ありません これは 便 利 です なぜなら OpenGL ESがCore Animationにとって 最 も 優 遇 できるグラフィックスライブラリであることを 意 味 するからです ただし OpenGL ESコンテ ンツをほかのコンテンツと 混 在 させるには 時 間 がかかります 適 切 に 使 用 しなければ アプリケー ションの 実 行 速 度 が 低 下 し やり 取 りを 行 うフレームレートに 到 達 するのに 時 間 がかかる 可 能 性 があ ります 最 良 のパフォーマンスを 確 実 に 実 現 するには アプリケーションにおいて OpenGL ESだけを 使 用 し てコンテンツをレンダリングする 必 要 があります OpenGL ESコンテンツを 保 持 するビューのサイズ を 画 面 に 一 致 させ 画 面 のopaqueプロパティをYES(GLKViewオブジェクトのデフォルト)に 設 定 し ほかのビューやCore Animationレイヤが 見 えないようにビューのサイズを 設 定 します レイヤの 中 で 一 番 上 に 合 成 されるCore Animationレイヤをレンダリングする 場 合 CAEAGLLayerオブ ジェクトを 不 透 明 にすることでパフォーマンス 上 の 負 担 は 軽 減 できますが なくすことはできませ ん CAEAGLLayerオブジェクトが その 下 にあるレイヤ 階 層 の 一 番 上 のレイヤで 合 成 される 場 合 レ 79
80 OpenGL ESアプリケーションのチューニング Core Animation 合 成 のパフォーマンスに 注 意 する ンダバッファの 色 データは Core Animationが 正 しく 合 成 するよう 事 前 乗 算 済 みのアルファ 形 式 に なっていなければなりません OpenGL ESコンテンツをほかのコンテンツの 上 で 合 成 することは パ フォーマンスの 著 しい 低 下 を 伴 います 80
81 頂 点 データを 扱 うためのベストプラクティス OpenGL ESを 使 用 するフレームをレンダリングするには アプリケーションにおいてグラフィックス パイプラインを 設 定 し 描 画 するグラフィックスプリミティブを 送 信 します すべてのプリミティブ を 同 じパイプライン 設 定 を 使 用 して 描 画 するアプリケーションもあれば フレームを 構 成 する 異 なる 要 素 を 別 々のテクニックを 使 用 して 描 画 するアプリケーションもあります しかし アプリケーショ ンがどのプリミティブを 使 用 するか またはパイプラインがどのように 設 定 されているかに 関 係 な く アプリケーションはOpenGL ESに 頂 点 を 提 供 します この 章 では 頂 点 データに 関 する 有 用 な 情 報 を 提 供 し 頂 点 データを 効 率 的 に 処 理 する 方 法 について 対 象 を 絞 ったアドバイスを 紹 介 します 頂 点 は 位 置 色 法 線 テクスチャの 座 標 など 1つ 以 上 の 属 性 で 構 成 されています OpenGL ES 2.0または3.0アプリケーションは 独 自 の 属 性 を 自 由 に 定 義 できます 頂 点 データの 各 属 性 は 頂 点 シェーダへの 入 力 の 働 きをする 属 性 変 数 と 対 応 しています OpenGL 1.1アプリケーションは 固 定 機 能 パイプラインによって 定 義 される 属 性 を 使 用 します アプリケーションは 1~4 個 のコンポーネントで 構 成 されるベクトルとして 属 性 を 定 義 します 属 性 内 のすべてのコンポーネントが 共 通 のデータ 型 を 共 有 します たとえば 色 は4 個 のGLubyteコン ポーネント( 赤 緑 青 アルファ)として 定 義 される 場 合 があります 属 性 がシェーダ 変 数 にロー ドされるとき アプリケーションデータ 内 で 提 供 されていないコンポーネントは OpenGL ESのデフォ ルト 値 で 埋 められます 図 8-1に 示 すように 最 後 のコンポーネントは1で 埋 められ 未 指 定 のほかの コンポーネントは0で 埋 められます 図 8-1 シェーダ 変 数 への 属 性 データの 変 換 アプリケーションが 属 性 を 定 数 として 設 定 する 可 能 性 があるということは 描 画 コマンドの 一 部 とし て 送 信 されるすべての 頂 点 について 同 じ 値 が 使 用 されることを 意 味 し 配 列 として 設 定 する 可 能 性 が あるということは 各 頂 点 がその 属 性 の 値 であることを 意 味 します アプリケーションがOpenGL ES の 関 数 を 呼 び 出 して 一 連 の 頂 点 を 描 画 する 場 合 頂 点 データはアプリケーションからグラフィックス 81
82 頂 点 データを 扱 うためのベストプラクティス モデルの 簡 素 化 ハードウェアにコピーされます そして グラフィックスハードウェアは 頂 点 データを 扱 い シェー ダで 各 頂 点 を 処 理 し プリミティブを 組 み 立 て プリミティブをラスタ 化 してフレームバッファに 送 ります OpenGL ESの 利 点 の1つは 頂 点 データをOpenGL ESに 送 信 する 関 数 の 単 一 のセットを 標 準 と して 採 用 していて OpenGLが 提 供 していた 古 くて 効 率 の 悪 い 仕 組 みは 削 除 されていることです フレームをレンダリングするため 多 数 のプリミティブを 送 信 しなければならないアプリケーション は 頂 点 データおよび 頂 点 データのOpenGL ESへの 提 供 方 法 を 注 意 深 く 管 理 する 必 要 があります こ の 章 で 説 明 する 方 法 は 次 に 示 すいくつかの 基 本 原 則 に 要 約 することができます 頂 点 データのサイズを 減 らす OpenGL ESがグラフィックスハードウェアに 頂 点 データを 転 送 する 前 に 必 ず 発 生 する 前 処 理 を 減 らす グラフィックスハードウェアに 頂 点 データをコピーするのにかかる 時 間 を 減 らす 各 頂 点 について 実 行 される 演 算 を 減 らす モデルの 簡 素 化 iosベースのデバイスのグラフィックスハードウェアは 非 常 に 高 性 能 ですが デバイスの 表 示 する 画 像 は 非 常 に 小 さいことがよくあります ios 上 に 魅 力 的 なグラフィックスを 表 示 するのに 極 端 に 複 雑 なモデルは 必 要 ありません モデルの 描 画 に 使 用 する 頂 点 の 数 を 減 らすことは 頂 点 データのサイズ および 頂 点 データについて 実 行 される 演 算 を 減 らすことに 直 接 つながります モデルの 複 雑 さは 次 に 示 すテクニックを 使 用 することで 低 減 できます 異 なる 詳 細 レベルのモデルを 複 数 バージョン 用 意 し カメラからのオブジェクトの 距 離 とディス プレイの 寸 法 に 基 づいて 適 切 なモデルを 実 行 時 に 選 ぶ テクスチャを 使 用 して 一 定 の 頂 点 情 報 を 不 要 にする たとえば バンプマップは 頂 点 データ をさらに 追 加 することなくモデルにディテールを 追 加 するのに 使 用 できます モデルによっては 頂 点 を 追 加 して ライティングのディテールやレンダリングの 質 を 向 上 させ る これは 通 常 値 を 各 頂 点 について 計 算 し ラスタ 化 の 段 階 で 三 角 形 を 対 象 に 値 を 補 間 する 場 合 に 行 われます たとえば スポットライトを 三 角 形 の 中 心 に 向 ける 場 合 スポットライトの 最 も 明 るい 部 分 は 頂 点 に 向 けられていないため スポットライトの 効 果 は 気 付 かれない 可 能 性 があ ります 頂 点 を 追 加 することで 頂 点 データのサイズやモデルについて 実 行 される 演 算 が 増 加 す るという 犠 牲 を 払 って 追 加 の 補 間 ポイントが 提 供 されます 追 加 の 頂 点 を 加 える 代 わりに パ イプラインのフラグメントの 段 階 に 演 算 を 移 動 することを 検 討 します アプリケーションでOpenGL ES 2.0 以 降 を 使 用 する 場 合 アプリケーションは 頂 点 シェーダの 演 算 を 実 行 し varying 変 数 に 結 果 を 割 り 当 てます varying 値 は グラフィックスハードウェ アによって 補 間 され 入 力 としてフラグメントシェーダに 渡 されます 代 わりに 演 算 の 入 82
83 頂 点 データを 扱 うためのベストプラクティス 属 性 の 配 列 に 定 数 を 格 納 するのを 避 ける 力 をvarying 変 数 に 割 り 当 てて フラグメントシェーダで 演 算 を 実 行 します これにより そ の 演 算 を 実 行 するコストが 頂 点 単 位 のコストからフラグメント 単 位 のコストに 変 わり パイ プラインにおける 頂 点 の 段 階 の 負 荷 と それよりも 大 きいフラグメントの 段 階 の 負 荷 が 低 減 されます これは 頂 点 処 理 においてアプリケーションがブロックされる 場 合 計 算 の 負 荷 が 大 きくない 場 合 および 変 更 によって 頂 点 の 数 が 大 幅 に 減 少 する 可 能 性 のある 場 合 に 実 行 します アプリケーションでOpenGL ES 1.1を 使 用 する 場 合 は DOT3ライティングを 使 用 してフラグメ ント 単 位 のライティングを 実 行 できます これは 具 体 的 には 法 線 情 報 を 保 持 するバンプ マップテクスチャの 追 加 およびGL_DOT3_RGBモードでのテクスチャ 合 成 操 作 を 使 用 したバ ンプマップの 適 用 によって 実 行 します 属 性 の 配 列 に 定 数 を 格 納 するのを 避 ける アプリケーションのモデルにモデル 全 体 において 固 定 されたままのデータを 使 用 する 属 性 が 含 まれる 場 合 は 各 頂 点 についてそのデータを 複 製 しないでください OpenGL ES 2.0および3.0アプリケーショ ンは 固 定 的 な 頂 点 属 性 を 設 定 することも その 代 わりに 値 を 保 持 する 一 定 のシェーダ 値 を 使 用 する こともできます OpenGL ES 1.1アプリケーションでは glcolor4ubやgltexcoord2fなどの 頂 点 単 位 の 属 性 関 数 を 使 用 します 属 性 には 可 能 な 限 り 最 小 の 型 を 使 用 する 属 性 のコンポーネントそれぞれのサイズを 指 定 するときは 必 要 な 結 果 が 得 られる 最 小 のデータ 型 を 選 びます 次 に いくつかのガイドラインを 示 します 頂 点 の 色 は 4 個 の 符 号 なしバイトコンポーネント(GL_UNSIGNED_BYTE)を 使 用 して 指 定 する 2 個 または4 個 の 符 号 なしバイト 値 (GL_UNSIGNED_BYTE) または 符 号 なしshort 値 (GL_UNSIGNED_SHORT)を 使 用 してテクスチャの 座 標 を 指 定 する テクスチャ 座 標 の 複 数 のセッ トを 単 一 の 属 性 に 詰 め 込 まないようにします OpenGL ESのGL_FIXEDデータ 型 の 使 用 を 避 ける このデータ 型 は GL_FLOATと 同 じ 量 のメモリを 必 要 としますが 値 の 範 囲 はより 狭 くなります すべてのiOSデバイスがハードウェアの 浮 動 小 数 点 ユニットをサポートしており 浮 動 小 数 点 の 値 をよりすばやく 処 理 することができます OpenGL ES 3.0のコンテキストでは GL_HALF_FLOATやGL_INT_2_10_10_10_REVなど 小 さなデー タ 型 のより 広 い 値 がサポートされます これらは 多 くの 場 合 GL_FLOATよりも 小 さな 専 有 量 で 法 線 などの 属 性 に 十 分 な 精 度 を 提 供 します 83
84 頂 点 データを 扱 うためのベストプラクティス インターリーブされた 頂 点 データを 使 用 する 比 較 的 小 さいコンポーネントを 指 定 する 場 合 は 頂 点 データのずれを 避 けるために 頂 点 フォーマット を 必 ず 再 編 成 してください 詳 細 については ずれた 頂 点 データを 避 ける (85 ページ)を 参 照 し てください インターリーブされた 頂 点 データを 使 用 する 頂 点 データを 連 続 する 配 列 ( 配 列 の 構 造 体 )または 各 要 素 が 複 数 の 属 性 を 含 む 配 列 ( 構 造 体 の 配 列 )として 指 定 することができます iosに 適 した 形 式 は インターリーブされた 単 一 の 頂 点 フォー マットを 使 用 する 構 造 体 の 配 列 です インターリーブされたデータを 使 用 すると 各 頂 点 につい て より 優 れたメモリ 配 置 が 可 能 となります 図 8-2 インターリーブされたメモリ 構 造 では ある 頂 点 に 関 するすべてのデータがまとめてメモリに 配 置 されます このルールの 例 外 は 一 部 の 頂 点 データをそれ 以 外 の 頂 点 データとは 異 なるレートで 更 新 する 必 要 の ある 場 合 または 一 部 のデータを2つ 以 上 のモデルで 共 有 可 能 な 場 合 です どちらの 場 合 も 属 性 デー タを2つ 以 上 の 構 造 体 に 分 けることは 可 能 です 図 8-3 一 部 のデータの 使 われ 方 が 異 なる 場 合 に 複 数 の 頂 点 構 造 体 を 使 用 する 84
85 頂 点 データを 扱 うためのベストプラクティス ずれた 頂 点 データを 避 ける ずれた 頂 点 データを 避 ける 頂 点 構 造 体 を 設 計 するときは 各 属 性 の 先 頭 をオフセット(コンポーネントのサイズの 倍 数 または4 バイトのどちらか 大 きい 方 )に 揃 えます 属 性 がずれている 場 合 iosはグラフィックスハードウェ アにデータを 渡 す 前 に 追 加 の 処 理 を 実 行 しなければなりません 図 8-4 (85 ページ)では 位 置 と 法 線 のデータがそれぞれ3つのshort 整 数 として 計 6バイトで 定 義 されています 法 線 データは オフセット6から 開 始 しています これはネイティブサイズ(2バイ ト)の 倍 数 ですが 4バイトの 倍 数 ではありません この 頂 点 データがiOSに 送 信 されたとすると ios は グラフィックスハードウェアにデータを 渡 す 前 に そのデータをコピーして 揃 えるための 時 間 を さらに 費 やす 必 要 があります これを 修 正 するため 各 属 性 の 後 に2バイトのパディングバイトを 明 示 的 に 追 加 します 図 8-4 追 加 の 処 理 を 避 けるために 頂 点 データを 揃 える 三 角 形 ストリップを 使 用 して 頂 点 データを 一 括 処 理 する 三 角 形 ストリップを 使 用 することで OpenGL ES がモデルに 対 して 実 行 しなければならない 頂 点 計 算 の 数 が 大 幅 に 減 少 します 図 8-5の 左 側 では 合 計 9 個 の 頂 点 を 使 用 して3 個 の 三 角 形 が 指 定 されてい ます C E Gは 実 際 には 同 じ 頂 点 を 指 定 しています データを 三 角 形 ストリップとして 指 定 するこ とにより 頂 点 の 数 を9 個 から5 個 に 減 らすことができます 図 8-5 三 角 形 ストリップ 85
86 頂 点 データを 扱 うためのベストプラクティス 三 角 形 ストリップを 使 用 して 頂 点 データを 一 括 処 理 する 場 合 によっては 複 数 の 三 角 形 ストリップを より 大 きな 単 一 の 三 角 形 ストリップとして 統 合 するこ とができます すべての 三 角 形 ストリップは レンダリング 要 件 が 同 じでなければなりません これ は 次 のことを 意 味 します 同 じシェーダを 使 用 してすべての 三 角 形 ストリップを 描 画 しなければなりません OpenGLの 状 態 を 一 切 変 えずにすべての 三 角 形 ストリップをレンダリングできなければなりませ ん 三 角 形 ストリップは 頂 点 の 属 性 が 同 じでなければなりません 2つの 三 角 形 ストリップをマージするには 図 8-6に 示 すように 1つ 目 のストリップの 最 後 の 頂 点 と 2つ 目 のストリップの 最 初 の 頂 点 を 二 重 にします このストリップをOpenGL ESに 送 信 すると 三 角 形 DEE 三 角 形 EEF 三 角 形 EFF 三 角 形 FFGは 縮 退 したとみなされて 処 理 もラスタ 化 もされません 図 8-6 縮 退 三 角 形 を 使 用 して 三 角 形 ストリップをマージする 最 高 のパフォーマンスを 得 るため モデルはインデックスのある 単 一 の 三 角 形 ストリップとして 送 信 する 必 要 があります 頂 点 バッファで 同 じ 頂 点 のデータを 複 数 回 指 定 するのを 避 けるために 別 個 の インデックスバッファを 使 用 し gldrawelements 関 数 ( 適 宜 gldrawelementsinstancedまたは gldrawrangeelements 関 数 )を 使 用 して 三 角 形 ストリップを 描 画 します OpenGL ES 3.0では 縮 退 三 角 形 を 使 用 しないで 三 角 形 ストリップをマージするプリミティブリスター ト 機 能 を 使 用 できます この 機 能 を 有 効 にすると OpenGL ESは インデックスバッファにおいて 可 能 な 最 大 値 を ある 三 角 形 ストリップを 終 了 して 別 の 三 角 形 ストリップを 開 始 するコマンドとして 扱 います リスト 8-1に この 方 法 を 示 します リスト 8-1 OpenGL ES 3.0でのプリミティブスタートの 使 用 // Prepare index buffer data (not shown: vertex buffer data, loading vertex and index buffers) GLushort indexdata[11] = { 0, 1, 2, 3, 4, // triangle strip ABCDE 0xFFFF, // primitive restart index (largest possible GLushort value) 5, 6, 7, 8, 9, // triangle strip FGHIJ 86
87 頂 点 データを 扱 うためのベストプラクティス 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 }; // Draw triangle strips glenable(gl_primitive_restart_fixed_index); gldrawelements(gl_triangle_strip, 11, GL_UNSIGNED_SHORT, 0); 可 能 な 場 合 は 同 じ 頂 点 を 共 有 する 三 角 形 が 三 角 形 ストリップ 内 でお 互 い 適 度 に 近 い 位 置 で 描 画 され るよう 頂 点 とインデックスのデータを 並 べ 替 えます グラフィックスハードウェアは 最 近 の 頂 点 演 算 をキャッシュして 頂 点 の 再 演 算 を 避 けます 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピー の 管 理 リスト 8-2では シンプルなアプリケーションが 頂 点 シェーダに 位 置 と 色 のデータを 提 供 するために 使 用 できる 関 数 を 示 しています この 関 数 では2つの 属 性 が 有 効 化 され それぞれの 属 性 がインター リーブされた 頂 点 構 造 体 を 参 照 するよう 設 定 されています 最 後 に gldrawelements 関 数 を 呼 び 出 して モデルを 単 一 の 三 角 形 ストリップとしてレンダリングします リスト 8-2 シェーダプログラムへの 頂 点 データの 送 信 typedef struct _vertexstruct { GLfloat position[2]; GLubyte color[4]; } vertexstruct; void DrawModel() { const vertexstruct vertices[] = {...}; const GLubyte indices[] = {...}; glvertexattribpointer(glkvertexattribposition, 2, GL_FLOAT, GL_FALSE, sizeof(vertexstruct), &vertices[0].position); glenablevertexattribarray(glkvertexattribposition); glvertexattribpointer(glkvertexattribcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexstruct), &vertices[0].color); 87
88 頂 点 データを 扱 うためのベストプラクティス 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 glenablevertexattribarray(glkvertexattribcolor); gldrawelements(gl_triangle_strip, sizeof(indices)/sizeof(glubyte), GL_UNSIGNED_BYTE, indices); } このコードは 動 作 はしますが 非 効 率 的 です DrawModelが 呼 び 出 されるごとにインデックスデータ と 頂 点 データがOpenGL ESにコピーされ グラフィックスハードウェアに 転 送 されます 呼 び 出 しと 呼 び 出 しの 間 で 頂 点 データが 変 化 しなければ データの 不 要 なコピーがパフォーマンスに 影 響 を 及 ぼ すおそれがあります 不 必 要 なコピーを 避 けるために アプリケーションは 頂 点 データを 頂 点 バッ ファオブジェクト(VBO)に 格 納 する 必 要 があります OpenGL ESは 頂 点 バッファオブジェクトのメ モリを 保 有 しているため グラフィックスハードウェアがよりアクセスしやすいメモリにバッファを 格 納 することも データがグラフィックスハードウェアに 適 したフォーマットになるよう 事 前 に 処 理 することもできます 注 意 : OpenGL ES 3.0で 頂 点 配 列 オブジェクトを 使 用 するときは 頂 点 バッファオブジェク トも 使 用 する 必 要 があります リスト 8-3のコードは 頂 点 バッファオブジェクトの 組 を 生 成 しています 一 方 は 頂 点 データ もう 一 方 はストリップのインデックスを 保 持 します どちらのオブジェクトの 場 合 も コードは 新 しいオ ブジェクトを 生 成 し そのオブジェクトを 現 在 のバッファにバインドし バッファを 埋 めます CreateVertexBuffersは アプリケーションの 初 期 化 時 に 呼 び 出 されます リスト 8-3 頂 点 バッファオブジェクトを 生 成 するコード 例 GLuint GLuint vertexbuffer; indexbuffer; void CreateVertexBuffers() { glgenbuffers(1, &vertexbuffer); glbindbuffer(gl_array_buffer, vertexbuffer); glbufferdata(gl_array_buffer, sizeof(vertices), vertices, GL_STATIC_DRAW); glgenbuffers(1, &indexbuffer); 88
89 頂 点 データを 扱 うためのベストプラクティス 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 glbindbuffer(gl_element_array_buffer, indexbuffer); glbufferdata(gl_element_array_buffer, sizeof(indices), indices, GL_STATIC_DRAW); } リスト 8-4は リスト 8-2 (87 ページ)を 修 正 し 頂 点 バッファオブジェクトを 使 うようにしたもの です リスト 8-4の 主 な 違 いは glvertexattribpointer 関 数 のパラメータが 頂 点 配 列 を 指 すもの でなくなった 点 です その 代 わり 各 パラメータは 頂 点 バッファオブジェクトへのオフセットとな ります リスト 8-4 頂 点 バッファオブジェクトを 使 って 描 画 するコード 例 void DrawModelUsingVertexBuffers() { glbindbuffer(gl_array_buffer, vertexbuffer); glvertexattribpointer(glkvertexattribposition, 2, GL_FLOAT, GL_FALSE, sizeof(vertexstruct), (void *)offsetof(vertexstruct, position)); glenablevertexattribarray(glkvertexattribposition); glvertexattribpointer(glkvertexattribcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexstruct), (void *)offsetof(vertexstruct, color)); glenablevertexattribarray(glkvertexattribcolor); glbindbuffer(gl_element_array_buffer, indexbuffer); gldrawelements(gl_triangle_strip, sizeof(indices)/sizeof(glubyte), GL_UNSIGNED_BYTE, (void*)0); } バッファの 使 用 に 関 するヒント これまでの 例 では 頂 点 バッファを 初 期 化 したら その 後 でそのコンテンツを 決 して 変 更 しませんで した 頂 点 バッファのコンテンツは 変 更 できます 頂 点 バッファオブジェクトの 設 計 の 重 要 な 部 分 は バッファに 格 納 されているデータの 使 いかたをアプリケーションがOpenGL ESに 通 知 できるとい うことです OpenGL ESの 実 装 は このヒントを 使 って 頂 点 データの 格 納 に 使 用 する 方 法 を 変 更 で きます リスト 8-3 (88 ページ)では glbufferdata 関 数 の 各 呼 び 出 しの 最 後 のパラメータに 用 途 のヒントが 指 定 されています GL_STATIC_DRAWをglBufferDataに 渡 すことにより 両 方 のバッファ の 内 容 が 変 更 される 予 定 はまったくないことがOpenGL ESに 伝 えられ それによってOpenGL ESはデー タを 格 納 する 方 法 と 場 所 を 最 適 化 するための 機 会 がさらに 与 えられます 89
90 頂 点 データを 扱 うためのベストプラクティス 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 OpenGL ESの 仕 様 には 次 の 使 用 事 例 が 定 義 されています GL_STATIC_DRAWは 何 度 もレンダリングされ コンテンツが 一 度 指 定 されると 変 更 されない 頂 点 バッファ 向 けです GL_DYNAMIC_DRAWは 何 度 もレンダリングされ レンダリングループ 中 にコンテンツが 変 更 され る 頂 点 バッファ 向 けです GL_STREAM_DRAWは レンダリングの 回 数 が 少 なくレンダリング 後 に 破 棄 される 頂 点 バッファ 向 けです In iosで GL_DYNAMIC_DRAWとGL_STREAM_DRAWは 同 等 です glbuffersubdata 関 数 を 使 用 してバッ ファコンテンツを 更 新 することができますが それはパフォーマンスを 低 下 を 招 きます コマンド バッファをフラッシュし すべてのコマンドの 完 了 を 待 機 するからです このパフォーマンス 上 の 負 担 は バッファリングを 二 重 化 または 三 重 化 することによって 若 干 軽 減 されます ( 詳 細 について は ダブルバッファリングによるリソースの 競 合 の 回 避 (63 ページ)を 参 照 してください )パ フォーマンスを 向 上 させるために OpenGL ES 3.0ではglMapBufferRange 関 数 を 使 用 し OpenGL ES 2.0または1.1ではEXT_map_buffer_range 機 能 拡 張 によって 提 供 される 対 応 する 関 数 を 使 用 してくだ さい 頂 点 フォーマット 内 のさまざまな 属 性 が 異 なる 使 用 パターンを 必 要 とする 場 合 は 頂 点 データを 複 数 の 構 造 体 に 分 割 し 使 用 方 法 の 特 徴 が 共 通 している 属 性 のコレクションごとに 独 立 した 頂 点 バッファ オブジェクトを 割 り 当 てます リスト 8-5は 独 立 したバッファを 使 用 して 色 データを 保 持 するよう 前 の 例 を 修 正 したものです GL_DYNAMIC_DRAWというヒントを 使 用 して 色 バッファを 割 り 当 てること により OpenGL ESは アプリケーションが 適 切 なパフォーマンスを 維 持 するようそのバッファを 割 り 当 てることができます リスト 8-5 複 数 の 頂 点 バッファオブジェクトの 使 用 によるモデルの 描 画 typedef struct _vertexstatic { GLfloat position[2]; } vertexstatic; typedef struct _vertexdynamic { GLubyte color[4]; } vertexdynamic; // Separate buffers for static and dynamic data. 90
91 頂 点 データを 扱 うためのベストプラクティス 頂 点 バッファオブジェクトの 使 用 による 頂 点 データのコピーの 管 理 GLuint GLuint GLuint staticbuffer; dynamicbuffer; indexbuffer; const vertexstatic staticvertexdata[] = {...}; vertexdynamic dynamicvertexdata[] = {...}; const GLubyte indices[] = {...}; void CreateBuffers() { // Static position data glgenbuffers(1, &staticbuffer); glbindbuffer(gl_array_buffer, staticbuffer); glbufferdata(gl_array_buffer, sizeof(staticvertexdata), staticvertexdata, GL_STATIC_DRAW); // Dynamic color data // While not shown here, the expectation is that the data in this buffer changes between frames. glgenbuffers(1, &dynamicbuffer); glbindbuffer(gl_array_buffer, dynamicbuffer); glbufferdata(gl_array_buffer, sizeof(dynamicvertexdata), dynamicvertexdata, GL_DYNAMIC_DRAW); // Static index data glgenbuffers(1, &indexbuffer); glbindbuffer(gl_element_array_buffer, indexbuffer); glbufferdata(gl_element_array_buffer, sizeof(indices), indices, GL_STATIC_DRAW); } void DrawModelUsingMultipleVertexBuffers() { glbindbuffer(gl_array_buffer, staticbuffer); glvertexattribpointer(glkvertexattribposition, 2, GL_FLOAT, GL_FALSE, sizeof(vertexstruct), (void *)offsetof(vertexstruct, position)); glenablevertexattribarray(glkvertexattribposition); 91
92 頂 点 データを 扱 うためのベストプラクティス 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 glbindbuffer(gl_array_buffer, dynamicbuffer); glvertexattribpointer(glkvertexattribcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexstruct), (void *)offsetof(vertexstruct, color)); glenablevertexattribarray(glkvertexattribcolor); glbindbuffer(gl_element_array_buffer, indexbuffer); gldrawelements(gl_triangle_strip, sizeof(indices)/sizeof(glubyte), GL_UNSIGNED_BYTE, (void*)0); } 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 DrawModelUsingMultipleVertexBuffers 複 数 の 頂 点 バッファオブジェクトの 使 用 によるモデルの 描 画 リスト 8-5 (90 ページ) 関 数 を 詳 しく 見 てみます この 関 数 により 多 くの 属 性 が 使 用 可 能 になり 複 数 の 頂 点 バッファオブジェクトがバインドされ バッファを 参 照 するよう 属 性 が 設 定 され ます その 初 期 化 コードのすべてが 基 本 的 に 静 的 であり フレームからフレームの 間 で 変 化 するパラ メータはありません この 関 数 がアプリケーションがフレームをレンダリングするごとに 呼 び 出 され る 場 合 は グラフィックスパイプラインを 設 定 し 直 すという 不 要 なオーバーヘッドが 多 数 存 在 してい ます アプリケーションが 数 多 くの 異 なる 種 類 のモデルを 描 画 する 場 合 パイプラインの 再 設 定 はボ トルネックとなる 可 能 性 があります 代 わりに 頂 点 配 列 オブジェクトを 使 用 して すべての 属 性 設 定 を 格 納 します 頂 点 配 列 オブジェクトはOpenGL ES 3.0コア 仕 様 の 一 部 であり OpenGL ES 2.0および 1.1ではOES_vertex_array_object 拡 張 機 能 を 使 用 して 利 用 できます 92
93 頂 点 データを 扱 うためのベストプラクティス 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 図 8-7は 2つの 頂 点 配 列 オブジェクトを 使 用 した 設 定 例 です 各 設 定 は 他 の 設 定 に 依 存 せず 各 頂 点 配 列 オブジェクトは 頂 点 属 性 の 別 のセットを 参 照 できます この 別 のセットは 同 じ 頂 点 バッファ オブジェクトに 格 納 したり 複 数 の 頂 点 バッファオブジェクトに 分 割 したりすることができます 図 8-7 頂 点 配 列 オブジェクトの 設 定 リスト 8-6は 上 記 の1つ 目 の 頂 点 配 列 オブジェクトの 設 定 に 使 用 するコードを 示 しています この コードは 新 しい 頂 点 配 列 オブジェクトの 識 別 子 を 生 成 し さらに 頂 点 配 列 オブジェクトをコンテキス トにバインドします この 後 コードが 頂 点 配 列 オブジェクトを 使 用 しなかった 場 合 と 同 じ 呼 び 出 し を 行 って 頂 点 属 性 を 設 定 します 設 定 は コンテキストではなく バインドされた 頂 点 配 列 オブジェ クトに 格 納 されます リスト 8-6 頂 点 配 列 オブジェクトの 設 定 void ConfigureVertexArrayObject() { // Create and bind the vertex array object. glgenvertexarrays(1,&vao1); glbindvertexarray(vao1); // Configure the attributes in the VAO. glbindbuffer(gl_array_buffer, vbo1); glvertexattribpointer(glkvertexattribposition, 3, GL_FLOAT, GL_FALSE, sizeof(staticfmt), (void*)offsetof(staticfmt,position)); glenablevertexattribarray(glkvertexattribposition); glvertexattribpointer(glkvertexattribtexcoord0, 2, GL_UNSIGNED_SHORT, GL_TRUE, sizeof(staticfmt), (void*)offsetof(staticfmt,texcoord)); glenablevertexattribarray(glkvertexattribtexcoord0); glvertexattribpointer(glkvertexattribnormal, 3, GL_FLOAT, GL_FALSE, 93
94 頂 点 データを 扱 うためのベストプラクティス バッファをクライアント 側 メモリにマップして 高 速 に 更 新 する sizeof(staticfmt), (void*)offsetof(staticfmt,normal)); glenablevertexattribarray(glkvertexattribnormal); glbindbuffer(gl_array_buffer, vbo2); glvertexattribpointer(glkvertexattribcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(dynamicfmt), (void*)offsetof(dynamicfmt,color)); glenablevertexattribarray(glkvertexattribcolor); // Bind back to the default state. glbindbuffer(gl_array_buffer,0); glbindvertexarray(0); } 描 画 するには コードによって 頂 点 配 列 オブジェクトをバインドし これまでと 同 じように 描 画 コマ ンドを 送 信 します 注 意 : OpenGL ES 3.0では 頂 点 配 列 データをクライアント 側 ストレージに 置 くことはでき なくなりました 頂 点 配 列 オブジェクトは 頂 点 バッファオブジェクトに 格 納 しなければなり ません 最 高 のパフォーマンスを 得 るため アプリケーションが 各 頂 点 配 列 オブジェクトを 設 定 したら 実 行 時 には 決 して 変 更 しないようにします その 代 わり 頂 点 配 列 オブジェクトをフレームごとに 変 更 す る 必 要 のある 場 合 は 複 数 の 頂 点 配 列 オブジェクトを 作 成 します たとえば バッファの 二 重 化 を 使 用 するアプリケーションは 頂 点 配 列 オブジェクトの1つ 目 のセットの 奇 数 フレーム 用 に そして2つ 目 のセットを 偶 数 フレーム 用 に 設 定 することができます 頂 点 配 列 オブジェクトの 各 セットは その セットのフレームのレンダリングに 使 用 する 頂 点 バッファオブジェクトを 参 照 します 頂 点 配 列 オブ ジェクトの 設 定 が 変 わらない 場 合 OpenGL ESは 頂 点 フォーマットに 関 する 情 報 をキャッシュして 頂 点 属 性 を 処 理 する 方 法 を 改 善 することができます バッファをクライアント 側 メモリにマップして 高 速 に 更 新 す る OpenGL ESアプリケーションの 設 計 では 動 的 リソースの 取 り 扱 いも 難 しい 問 題 です 特 に 頂 点 デー タがフレームごとに 変 わる 場 合 が 困 難 です CPUとGPUが 均 衡 を 保 って 動 作 するためには アプリケー ション 側 メモリ 空 間 と OpenGL ESのメモリとのデータ 転 送 を 慎 重 に 管 理 しなければなりません 94
95 頂 点 データを 扱 うためのベストプラクティス バッファをクライアント 側 メモリにマップして 高 速 に 更 新 する glbuffersubdata 関 数 を 使 うなど 従 来 型 の 技 法 では 性 能 が 損 なわれる 可 能 性 があります データ 転 送 中 はGPUに 待 機 するよう 強 制 するからです 同 じバッファの 別 の 場 所 にあるデータをもとにレンダ リングすることもできません たとえば 高 フレームレートのレンダリングループにおける 各 パスで 頂 点 バッファを 修 正 すると 同 時 に その 内 容 を 描 画 できれば 性 能 向 上 に 役 立 つかも 知 れません しかし CPUがバッファメモリ にアクセスして 次 のフレームの 描 画 準 備 をしている 間 に レンダリングが 済 んだ 最 終 フレームの 描 画 コマンドが なおGPUを 使 っている 可 能 性 があります そのためバッファ 更 新 関 数 は GPUの 処 理 終 了 まで CPUでの 処 理 をブロックします このような 状 況 では CPUとGPUのバッファアクセスを 手 動 で 同 期 させることにより 性 能 を 改 善 できます glmapbufferrange 関 数 を 使 えば より 効 率 よく 頂 点 バッファを 動 的 に 更 新 できます(この 関 数 は OpenGL ES 3.0ではコアAPIの 一 部 になっています OpenGL ES 1.1および2.0では EXT_map_buffer_range 拡 張 機 能 として 提 供 されています) この 関 数 で OpenGL ESメモリのある 領 域 を 指 すポインタを 取 得 し これを 使 って 新 規 データを 書 き 出 せます glmapbufferrange 関 数 は バッファのデータストレージ 中 のある 部 分 領 域 を クライアント 側 メモリにマップすることがで きるのです さらに OpenGLの 同 期 オブジェクトと 併 用 することを 考 慮 して 非 同 期 にバッファを 修 正 するためのヒントにも 対 応 しています(リスト 8-7を 参 照 ) リスト 8-7 手 動 同 期 により 頂 点 バッファを 動 的 に 更 新 するコード 例 GLsync fence; GLboolean UpdateAndDraw(GLuint vbo, GLuint offset, GLuint length, void *data) { GLboolean success; // Bind and map buffer. glbindbuffer(gl_array_buffer, vbo); void *old_data = glmapbufferrange(gl_array_buffer, offset, length, GL_MAP_WRITE_BIT GL_MAP_FLUSH_EXPLICIT_BIT GL_MAP_UNSYNCHRONIZED_BIT ); // Wait for fence (set below) before modifying buffer. glclientwaitsync(fence, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); // Modify buffer, flush, and unmap. memcpy(old_data, data, length); glflushmappedbufferrange(gl_array_buffer, offset, length); success = glunmapbuffer(gl_array_buffer); 95
96 頂 点 データを 扱 うためのベストプラクティス バッファをクライアント 側 メモリにマップして 高 速 に 更 新 する // Issue other OpenGL ES commands that use other ranges of the VBO's data. // Issue draw commands that use this range of the VBO's data. DrawMyVBO(vbo); // Create a fence that the next frame will wait for. fence = glfencesync(gl_sync_gpu_commands_complete, 0); return success; } この 例 のUpdateAndDraw 関 数 は 特 定 のバッファオブジェクトを 使 う 描 画 コマンドを 実 行 した 直 後 に glfencesync 関 数 で 同 期 ポイント(フェンス)を 確 立 しています (レンダリングループの 次 の パスでは)glClientWaitSync 関 数 で 同 期 ポイントを 確 認 した 上 で バッファオブジェクトを 修 正 しま す レンダリングループを 一 回 りして 戻 ってくる 前 に GPU 上 で 描 画 コマンドの 実 行 が 終 了 した 場 合 CPU 側 で 実 行 がブロックされることはないので UpdateAndDraw 関 数 はそのままバッファを 修 正 し 次 のフレームを 描 画 します 一 方 描 画 コマンドの 実 行 が 終 わっていなければ glclientwaitsync 関 数 はGPUがフェンスに 到 達 するまで さらにCPU 側 の 実 行 をブロックし 続 けます リソースが 衝 突 しうる 箇 所 のまわりにのみ 手 動 で 同 期 ポイントを 置 くことにより CPUがGPUの 処 理 終 了 を 待 つ 時 間 を 最 小 限 に 抑 えることができます 96
97 テクスチャデータを 扱 うためのベストプラク ティス テクスチャデータは アプリケーションがフレームのレンダリングに 使 用 するデータのうち 最 も 大 き い 部 分 を 占 めることが 少 なくありません それは テクスチャが 美 しい 画 像 をユーザに 表 示 するため に 必 要 なディテールを 提 供 してくれるためです アプリケーションからできるだけ 最 高 のパフォーマ ンスを 引 き 出 すため アプリケーションのテクスチャを 注 意 深 く 管 理 します テクスチャの 管 理 に 関 するガイドラインは 次 のとおりです アプリケーションの 初 期 化 時 にテクスチャを 作 成 し レンダリングループの 間 はテクスチャを 決 して 変 更 しない テクスチャの 使 用 するメモリの 量 を 減 らす 比 較 的 小 さいテクスチャをより 大 きいテクスチャアトラスにまとめる ミップマップを 使 用 して テクスチャデータをフェッチするのに 必 要 な 帯 域 幅 を 減 らす マルチテクスチャリングを 使 用 してテクスチャリング 演 算 を 実 行 する 初 期 化 中 にテクスチャをロードする テクスチャの 作 成 とロードはコストのかかる 操 作 です 最 良 のパフォーマンスを 得 るにはアプリケー ションの 実 行 中 に 新 しいテクスチャを 作 成 することは 避 けます 代 わりに 初 期 化 中 にテクスチャ データの 作 成 とロードを 行 います テクスチャを 作 成 したら フレームの 最 初 または 最 後 以 外 でのテクスチャの 変 更 は 避 けます 現 時 点 では すべてのiOSデバイスはタイルベースの 遅 延 レンダラを 使 用 しています このレンダラは gltexsubimage 関 数 とglCopyTexSubImage 関 数 の 呼 び 出 しの 際 に 特 にコストがかかります 詳 細 に ついては Tile-Based Deferred Rendering in OpenGL ES Hardware Platform Guide for ios を 参 照 してくだ さい GLKitフレームワークを 使 用 したテクスチャデータの 読 み 込 み テクスチャデータの 読 み 込 みは 明 確 にするために 重 要 な 基 本 的 演 算 です GLKitフレームワークを 使 用 して GLKTextureLoaderクラスは 新 しいテクスチャの 作 成 と 読 み 込 みを 容 易 にします GLKTextureLoaderクラスは ファイル URL メモリ 保 存 形 式 CGImagesなど さまざまなソース からテクスチャデータを 読 み 込 むことができます 入 力 ソースに 関 係 なく GLKTextureLoaderクラ スは 新 しいテクスチャを 作 成 したりデータから 読 み 込 んだりし テクスチャ 情 報 をGLKTextureInfo 97
98 テクスチャデータを 扱 うためのベストプラクティス 初 期 化 中 にテクスチャをロードする オブジェクトとして 返 します GLKTextureInfoオブジェクトのプロパティにアクセスし テクスチャ をコンテキストにバインドしたり 描 画 のために 有 効 にするなど さまざまなタスクを 実 行 すること ができます 注 意 : GLKTextureInfoオブジェクトは それが 記 述 するOpenGL ESテクスチャオブジェク トを 所 有 しません テクスチャオブジェクトを 使 用 し 終 わったら gldeletetextures 関 数 を 呼 び 出 して 破 棄 する 必 要 があります リスト 9-1に ファイルから 新 しいテクスチャを 読 み 込 んだり 後 で 使 用 するためにテクスチャを 有 効 にしたりするための 一 般 的 な 方 法 を 示 します リスト 9-1 ファイルからの2 次 元 テクスチャの 読 み 込 み GLKTextureInfo *spritetexture; NSError *theerror; NSString *filepath = [[NSBundle mainbundle] pathforresource:@"sprite" oftype:@"png"]; // 1 spritetexture = [GLKTextureLoader texturewithcontentsoffile:filepath options:nil error:&theerror]; // 2 glbindtexture(spritetexture.target, spritetexture.name); // 3 glenable(spritetexture.target); // 4 一 覧 内 で 番 号 が 付 けられた 手 順 に 対 応 して コードが 行 うことを 次 に 示 します 1. テキスチャデータを 含 む 画 像 へのパスを 作 成 します このパスは GLKTextureLoaderクラスの texturewithcontentsoffile:options:error:メソッドにパラメータとして 渡 されます 2. 画 像 ファイルから 新 しいテクスチャを 読 み 込 み テクスチャ 情 報 をGLKTextureInfoオブジェク トに 格 納 します さまざまなテクスチャ 読 み 込 みオプションが 用 意 されています 詳 細 について は GLKTextureLoader Class Reference を 参 照 してください 3. GLKTextureInfoオブジェクトの 該 当 するプロパティをパラメータとして 使 用 して テクスチャ をコンテキストにバインドします 4. GLKTextureInfoオブジェクトの 該 当 するプロパティをパラメータとして 使 用 して 描 画 のため にテクスチャの 使 用 を 有 効 にします 98
99 テクスチャデータを 扱 うためのベストプラクティス テクスチャのメモリ 使 用 量 を 削 減 する GLKTextureLoaderクラスは 最 も 一 般 的 な 画 像 形 式 のキューブマップテクスチャを 読 み 込 むことも できます そして アプリケーションは 実 行 中 に 新 しいテクスチャを 読 み 込 んだり 作 成 したりする 必 要 がある 場 合 GLKTextureLoaderクラスはテクスチャの 非 同 期 読 み 込 みのメソッドも 提 供 しま す 詳 細 については GLKTextureLoader Class Reference を 参 照 してください テクスチャのメモリ 使 用 量 を 削 減 する iosアプリケーションが 使 用 するメモリ 量 を 減 らすことは 常 にアプリケーションのチューニングに おける 重 要 な 部 分 です とはいえ OpenGL ESアプリケーションも テクスチャを 読 み 込 むために 使 用 できる 総 メモリ 量 が 制 限 されています アプリケーションがテクスチャデータの 保 持 に 使 用 するメ モリ 量 をできるだけ 抑 えるようにします テクスチャが 使 用 するメモリを 減 らすことは 必 ずといっ ていいほど 画 像 の 品 質 を 犠 牲 にします そのため アプリケーションがテクスチャに 加 える 変 更 と 最 終 的 にレンダリングされたフレームの 品 質 レベルとのバランスをとらなければなりません 最 良 の 結 果 を 得 るため 以 下 に 示 す 別 のテクニックを 試 し 許 容 できる 品 質 レベルで 最 もメモリが 節 約 され る 方 法 を 選 びます テクスチャの 圧 縮 テクスチャの 圧 縮 は 通 常 メモリの 節 約 と 品 質 のバランスが 最 もよくとれる 方 法 です ios OpenGL ES では 複 数 の 圧 縮 テクスチャフォーマットがサポートされています すべてのiOSデバイスで GL_IMG_texture_compression_pvrtc 拡 張 機 能 を 実 装 することによって PowerVR Texture Compression(PVRTC)フォーマットがサポートされています PVRTC 圧 縮 には 4ビット/ピク セルと2ビット/ピクセルの2つのレベルがあり 圧 縮 なしの32ビットテクスチャフォーマットと 比 較 して 圧 縮 率 はそれぞれ8:1と16:1です 圧 縮 されたPVRTCテクスチャでも 特 に4ビットレベルの 場 合 は 相 当 レベルの 品 質 を 提 供 できます テクスチャをPVRTCフォーマットに 圧 縮 する 方 法 については texturetoolを 使 用 したテクスチャの 圧 縮 (143 ページ)を 参 照 してください OpenGL ES 3.0はETC2およびEACという 圧 縮 テクスチャフォーマットも 扱 えますが iosデバイスでは PVRTCテクスチャを 使 うよう 推 奨 します 低 精 度 のカラーフォーマットを 使 用 する アプリケーションで 圧 縮 テクスチャを 使 用 できない 場 合 より 低 精 度 のピクセルフォーマットの 使 用 を 検 討 します フォーマットがRGB565 RGBA5551 またはRGBA4444のテクスチャは RGBA8888フォー マットのテクスチャの 半 分 のメモリ 使 用 で 済 みます RGBA8888を 使 用 するのは アプリケーション でそのレベルの 品 質 が 必 要 な 場 合 のみにします 99
100 テクスチャデータを扱うためのベストプラクティス 複数のテクスチャをテクスチャアトラスにまとめる 適切なサイズのテクスチャを使用する iosベースのデバイスが表示する画像は非常に小さいものです アプリケーションでは 画面に対し て適切な画像を表示するために大きなテクスチャを提供する必要はありません テクスチャの縦横両 方の寸法を半分にすれば そのテクスチャに必要なメモリ量は元のテクスチャの4分の1に削減できま す テクスチャを縮小する前に まずテクスチャの圧縮や低精度のカラーフォーマットの使用を試してみ るべきです 一般に PVRTCフォーマットによるテクスチャの圧縮を使用した方がテクスチャを縮小 するよりも画像の品質は高く しかもメモリの使用量も少なくて済みます 複数のテクスチャをテクスチャアトラスにまとめる テクスチャへのバインドでは OpenGL ESによる処理に時間がかかります OpenGL ESの状態を変更す る回数が少ないアプリケーションのほうがパフォーマンスが高くなります テクスチャに関して 新 たなテクスチャへのバインドを避ける方法の1つは 複数の小さなテクスチャを結合して 1つの大き なテクスチャ テクスチャアトラスと呼ぶ にすることです テクスチャアトラスを使用すると 単 一のテクスチャをバインドし テクスチャを使用する複数の描画呼び出しを行ったり さらに複数の 描画呼び出しを単一の描画呼び出しにしたりすることもできます 頂点データで提供されるテクス チャの座標は テクスチャアトラス内のテクスチャのより小さい部分を選ぶよう修正されます テクスチャアトラスには次のような制限があります GL_REPEATテクスチャラップパラメータを使用している場合は テクスチャアトラスを使用でき ません 100
101 テクスチャデータを 扱 うためのベストプラクティス ミップマップを 使 用 してメモリの 帯 域 幅 の 使 用 を 削 減 する フィルタリングすると 想 定 の 範 囲 を 超 えたテクセルが 取 得 される 場 合 があります テクスチャア トラス 内 でこのようなテクスチャを 使 用 するには テクスチャアトラスを 構 成 するテクスチャの 間 にパディングを 配 置 する 必 要 があります テクスチャアトラスもまた1つのテクスチャであるため 他 のテクスチャ 属 性 と 同 様 に OpenGL ES 実 装 の 最 大 テクスチャサイズの 影 響 を 受 けます Xcode 5は 画 像 のコレクションからテキスチャアトラスを 自 動 的 に 構 築 できます テクスチャアト ラスの 作 成 の 詳 細 については テクスチャアトラスのヘルプを 参 照 してください この 機 能 は Sprite Kitフレームワークを 使 用 する 開 発 者 に 対 して 主 に 提 供 されますが アプリケーションはそれが 生 成 す るテキスチャアトラスファイルを 使 用 できます Xcodeは プロジェクトの.atlasフォルダごとに アプリケーションバンドルに.atlascフォルダを 作 成 します これには 1つ 以 上 のコンパイルされ たアトラス 画 像 とプロパティリスト(.plist)ファイルが 含 まれます プロパティリストファイルは アトラスとアトラス 画 像 内 でのそれらの 場 所 を 構 成 する 個 々の 画 像 を 記 述 します この 情 報 を 使 用 し て OpenGL ESの 描 画 での 使 用 に 適 したテクスチャ 座 標 を 計 算 することができます ミップマップを 使 用 してメモリの 帯 域 幅 の 使 用 を 削 減 する 2Dの 拡 大 縮 小 なしの 画 像 を 描 画 する 場 合 を 除 いて アプリケーションはすべてのテクスチャにミップ マップを 提 供 するべきです ミップマップは 余 分 なメモリを 使 用 しますが テクスチャリングによる アーティファクトを 抑 制 し 画 像 の 品 質 を 向 上 させます さらに 重 要 なことは サンプリングされた ミップマップが 小 さければ 小 さいほど テクスチャメモリから 取 得 されるテクセルも 少 なくなり グ ラフィックスハードウェアが 必 要 とするメモリの 帯 域 幅 が 削 減 され パフォーマンスが 向 上 します GL_LINEAR_MIPMAP_LINEARフィルタモードはテクスチャリングの 際 に 最 良 の 品 質 を 提 供 しますが メモリから 余 分 にテクセルを 取 得 する 必 要 があります GL_LINEAR_MIPMAP_NEARESTフィルタモード を 指 定 すると 画 像 品 質 を 落 とす 代 わりにパフォーマンスを 向 上 させることができます ミップマップとテクスチャアトラスを 組 み 合 わせる 場 合 OpenGL ES 3.0ではTEXTURE_MAX_LEVELパ ラメータを 使 って テクスチャのフィルタリング 方 法 を 制 御 します(この 機 能 はOpenGL ES 1.1や2.0 でも APPLE_texture_max_level 拡 張 機 能 として 適 用 可 ) マルチパスの 代 わりにマルチテクスチャリングを 使 用 する 多 くのアプリケーションが パスごとにグラフィックスパイプラインの 設 定 を 変 えながら 複 数 のパ スを 実 行 してモデルを 描 画 します これは グラフィックスパイプラインを 設 定 し 直 す 回 数 が 増 える だけでなく パスごとに 頂 点 情 報 を 再 処 理 したり 後 半 のパスではピクセルデータをフレームバッ ファから 読 み 直 したりする 必 要 が 生 じます 101
102 テクスチャデータを 扱 うためのベストプラクティス マルチパスの 代 わりにマルチテクスチャリングを 使 用 する iosにおけるopengl ESの 実 装 は 少 なくとも2つのテクスチャユニットをサポートし ほとんどのデ バイスが 少 なくとも8 個 のテクスチャユニットをサポートします アプリケーションはこれらのテク スチャユニットを 使 用 し 各 パスのアルゴリズムにおいてできるだけ 多 くの 手 順 を 実 行 する 必 要 があ ります glgetintegerv 関 数 を 呼 び 出 し パラメータとしてGL_MAX_TEXTURE_UNITSを 渡 すことによ り アプリケーションで 利 用 可 能 なテクスチャユニットの 数 を 取 得 できます 1つのオブジェクトをレンダリングするためにマルチパスが 必 要 な 場 合 は 次 の 点 に 注 意 してくださ い パスのたびに 位 置 データが 変 化 しないことを 保 証 すること 2つ 目 以 降 のパスでは GL_EQUALをパラメータとしてglDepthFunc 関 数 を 呼 び 出 して モデルの 表 面 上 のピクセルをテストすること 102
103 シェーダのベストプラクティス シェーダは 高 い 柔 軟 性 をもたらしますが 多 くの 計 算 を 実 行 しすぎたり 計 算 の 効 率 が 悪 かったりす ると 大 きなボトルネックとなるおそれがあります 初 期 化 中 にシェーダをコンパイルおよびリンクする シェーダプログラムの 作 成 は OpenGL ESのその 他 の 状 態 変 更 に 比 べて コストのかかる 操 作 です アプリケーションを 初 期 化 するときに プログラムのコンパイル リンク および 検 証 を 行 います すべてのシェーダを 作 成 したら アプリケーションではglUseProgramを 呼 び 出 すことによって 効 率 的 にそれらを 切 り 替 えることができます デバッグ 時 のシェーダプログラムエラーのチェック シェーダプログラムのコンパイルまたはリンク 後 に 診 断 情 報 に 読 み 込 むことはアプリケーションのリ リースビルドでは 不 要 であり パフォーマンスが 低 下 する 可 能 性 があります OpenGL ES 関 数 を 使 用 して シェーダコンパイルを 読 み 込 むか アプリケーションの 開 発 ビルドでのみログをリンクします (リスト 10-1を 参 照 ) リスト 10-1 開 発 ビルドでのみシェーダのコンパイル/リンクログを 読 み 込 む // After calling glcompileshader, gllinkprogram, or similar #ifdef DEBUG // Check the status of the compile/link glgetprogramiv(prog, GL_INFO_LOG_LENGTH, &loglen); if(loglen > 0) { // Show any errors as appropriate glgetprograminfolog(prog, loglen, &loglen, log); fprintf(stderr, "Prog Info Log: %s\n", log); } #endif 103
104 シェーダのベストプラクティス 初 期 化 中 にシェーダをコンパイルおよびリンクする 同 様 に glvalidateprogram 関 数 も 開 発 ビルドでのみ 呼 び 出 す 必 要 があります この 関 数 を 使 用 し て シェーダプログラムで 必 要 なすべてのテクスチャユニットをバインドできないなどの 開 発 エラー を 検 出 することができます ただし 検 証 プログラムでは OpenGL ESのコンテキスト 状 態 全 体 に 対 して 開 発 エラーがチェックされるため これはコストのかかる 操 作 です プログラム 検 証 の 結 果 に 意 味 があるのは 開 発 中 だけであるため アプリケーションのリリースビルドではこの 関 数 を 呼 び 出 さな いでください コンパイルとリンクを 高 速 化 するために 別 々のシェーダオブジェクトを 使 用 する 多 くのOpenGL ESアプリケーションでは いくつかの 頂 点 シェーダとフラグメントシェーダが 使 用 さ れ 頂 点 シェーダが 異 なる 同 じフラグメントシェーダまたはフラグメントシェーダが 異 なる 同 じ 頂 点 シェーダを 再 利 用 すると 便 利 なことがよくあります OpenGL ESコア 仕 様 では 頂 点 シェーダとフラ グメントシェーダを1つのシェーダプログラムでリンクさせる 必 要 があるため 多 数 のプログラムで シェーダの 結 果 を 組 み 合 わせたり 照 合 したりすると アプリケーションの 初 期 化 時 にシェーダのコン パイルとリンクの 合 計 時 間 が 増 えます iosでのopengl ES 2.0および3.0のコンテキストでは EXT_separate_shader_objects 拡 張 機 能 がサ ポートされます この 拡 張 機 能 によって 提 供 される 関 数 を 使 用 して 頂 点 シェーダとフラグメント シェーダを 別 々にコンパイルしたり プログラムパイプラインオブジェクトを 使 用 してレンダリング 時 に 事 前 にコンパイルされたシェーダ 段 階 を 組 み 合 わせたり 照 合 したりすることができます さら に この 拡 張 機 能 により リスト 10-2に 示 すように シェーダをコンパイルしたり 使 用 したりするた めの 簡 単 なインターフェイスが 提 供 されます リスト 10-2 独 立 したシェーダオブジェクトをコンパイル 使 用 するコード 例 - (void)loadshaders { const GLchar *vertexsourcetext = "... vertex shader GLSL source code... "; "; const GLchar *fragmentsourcetext = "... fragment shader GLSL source code... // Compile and link the separate vertex shader program, then read its uniform variable locations _vertexprogram = glcreateshaderprogramvext(gl_vertex_shader, 1, &vertexsourcetext); _uniformmodelviewprojectionmatrix = glgetuniformlocation(_vertexprogram, "modelviewprojectionmatrix"); _uniformnormalmatrix = glgetuniformlocation(_vertexprogram, "normalmatrix"); 104
105 シェーダのベストプラクティス 初 期 化 中 にシェーダをコンパイルおよびリンクする // Compile and link the separate fragment shader program (which uses no uniform variables) _fragmentprogram = glcreateshaderprogramvext(gl_fragment_shader, 1, &fragmentsourcetext); // Construct a program pipeline object and configure it to use the shaders glgenprogrampipelinesext(1, &_ppo); glbindprogrampipelineext(_ppo); gluseprogramstagesext(_ppo, GL_VERTEX_SHADER_BIT_EXT, _vertexprogram); gluseprogramstagesext(_ppo, GL_FRAGMENT_SHADER_BIT_EXT, _fragmentprogram); } - (void)glkview:(glkview *)view drawinrect:(cgrect)rect { // Clear the framebuffer glclearcolor(0.65f, 0.65f, 0.65f, 1.0f); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // Use the previously constructed program pipeline and set uniform contents in shader programs glbindprogrampipelineext(_ppo); glprogramuniformmatrix4fvext(_vertexprogram, _uniformmodelviewprojectionmatrix, 1, 0, _modelviewprojectionmatrix.m); glprogramuniformmatrix3fvext(_vertexprogram, _uniformnormalmatrix, 1, 0, _normalmatrix.m); // Bind a VAO and render its contents glbindvertexarrayoes(_vertexarray); gldrawelements(gl_triangle_strip, _indexcount, GL_UNSIGNED_SHORT, 0); } 105
106 シェーダのベストプラクティス シェーダに 関 するハードウェア 制 限 に 従 う シェーダに 関 するハードウェア 制 限 に 従 う OpenGL ESでは 頂 点 シェーダまたはフラグメントシェーダで 使 用 できる 各 変 数 型 の 数 が 制 限 されて います OpenGL ES 仕 様 では これらの 制 限 を 超 えた 場 合 のソフトウェアフォールバックを 提 供 する ための 実 装 は 不 要 です 代 わりに シェーダはコンパイルまたはリンクに 失 敗 します アプリケー ションの 開 発 時 には シェーダのコンパイル 中 にエラーが 発 生 しないことを 確 認 する 必 要 があります (リスト 10-1を 参 照 ) 精 度 ヒントを 使 用 する 組 み 込 みデバイスの 厳 しいハードウェア 制 限 に 相 応 しいコンパクトなシェーダ 変 数 のニーズに 対 応 す るために GLSL ESの 言 語 仕 様 に 精 度 ヒントが 追 加 されました 各 シェーダはデフォルトの 精 度 を 定 義 しなければなりません 個 々のシェーダ 変 数 はこの 精 度 をオーバーライドして その 変 数 のアプリ ケーションにおける 使 用 方 法 についてコンパイラにヒントを 提 供 する 場 合 があります OpenGL ESの 実 装 では ヒント 情 報 を 使 用 する 必 要 はありませんが より 効 率 の 良 いシェーダを 生 成 するためにヒ ント 情 報 を 使 用 することは 可 能 です GLSL ES 仕 様 には 各 ヒントの 範 囲 と 精 度 の 一 覧 が 示 されてい ます Important: 精 度 ヒントで 定 義 されている 範 囲 制 限 は 強 制 ではありません そのため データがこ の 範 囲 に 収 まっていると 想 定 することはできません 以 下 にそのガイドラインを 示 します 判 断 がつかない 場 合 は 高 精 度 をデフォルトにする 0.0~1.0の 範 囲 の 色 は 通 常 低 精 度 の 変 数 を 使 用 して 表 現 できる 位 置 データは 通 常 高 精 度 で 格 納 する ライティングの 計 算 で 使 用 される 法 線 とベクトルは 通 常 中 精 度 で 格 納 できる 精 度 を 下 げた 後 は アプリケーションを 再 テストして 結 果 が 期 待 通 りのものであることを 確 認 する リスト 10-3は 高 精 度 の 変 数 がデフォルトですが 高 精 度 は 不 要 なため 低 精 度 の 変 数 を 使 用 して 色 出 力 を 計 算 します リスト 10-3 フラグメントの 色 に 低 精 度 を 使 用 する precision highp float; // Defines precision for float and float-derived (vector/matrix) types. uniform lowp sampler2d sampler; // Texture2D() result is lowp. 106
107 シェーダのベストプラクティス ベクトル 計 算 の 時 間 のかかる 実 行 varying lowp vec4 color; varying vec2 texcoord; // Uses default highp precision. void main() { gl_fragcolor = color * texture2d(sampler, texcoord); } シェーダ 変 数 の 実 際 の 精 度 はIOSデバイスによって 異 なることがあります 各 精 度 レベルでの 処 理 性 能 も 同 様 です デバイスに 応 じて 考 慮 するべき 事 項 については iosdevicecompatibilityreference を 参 照 してください ベクトル 計 算 の 時 間 のかかる 実 行 すべてのグラフィックスプロセッサにベクトルプロセッサが 含 まれているわけではなく スカラープ ロセッサ 上 でベクトル 計 算 を 実 行 するグラフィックスプロセッサもあります シェーダで 計 算 を 実 行 する 場 合 は スカラープロセッサ 上 計 算 が 実 行 される 場 合 であっても 効 率 的 に 実 行 されるよう 演 算 の 順 序 を 考 慮 します リスト 10-4のコードがベクトルプロセッサ 上 で 実 行 される 場 合 各 乗 算 は4 個 のベクトルのコンポー ネントすべてにわたって 並 行 して 実 行 されます ただし 括 弧 の 位 置 が 理 由 で 3つのパラメータの うち2つがスカラー 値 であっても プロセッサ 上 の 同 じ 演 算 で8 回 の 乗 算 を 要 することになります リスト 10-4 ベクトル 演 算 をうまく 活 用 していない highp float f0, f1; highp vec4 v0, v1; v0 = (v1 * f0) * f1; リスト 10-5に 示 すように 括 弧 を 移 動 することによって 同 じ 計 算 をさらに 効 率 的 に 実 行 できます こ の 例 では スカラー 値 を 最 初 に 乗 じて その 結 果 をベクトルパラメータで 乗 じます 全 体 の 演 算 は 5つの 乗 算 で 計 算 できます リスト 10-5 ベクトル 演 算 の 適 切 な 使 用 highp float f0, f1; highp vec4 v0, v1; 107
108 シェーダのベストプラクティス シェーダ 内 での 計 算 の 代 わりにuniformまたはconstantを 使 用 する v0 = v1 * (f0 * f1); 同 様 に アプリケーションで 結 果 のコンポーネントすべてを 使 用 するわけではない 場 合 は 必 ずベ クトル 演 算 に 書 き 込 みマスクを 指 定 してください スカラープロセッサ 上 では マスクで 指 定 されて いないコンポーネントの 計 算 はスキップできます リスト 10-6は 2つのコンポーネントだけを 必 要 と 指 定 しているため スカラープロセッサ 上 では2 倍 の 速 度 で 実 行 されます リスト 10-6 書 き 込 みマスクの 指 定 highp vec4 v0; highp vec4 v1; highp vec4 v2; v2.xz = v0 * v1; シェーダ 内 での 計 算 の 代 わりにuniformまたはconstantを 使 用 する シェーダの 外 部 で 値 を 計 算 できる 場 合 は 値 をuniformまたはconstantとしてシェーダに 渡 します 動 的 な 値 の 再 計 算 は シェーダでは 非 常 に 負 荷 が 大 きくなる 可 能 性 があります 分 岐 命 令 は 注 意 して 使 う シェーダ 内 での 分 岐 は 推 奨 されません 3Dグラフィックスプロセッサ 上 で 並 列 に 演 算 を 実 行 する 能 力 が 低 下 する 可 能 性 があるためです(OpenGL ES 3.0 対 応 デバイスでは それほど 深 刻 ではありません が) まったく 分 岐 命 令 を 使 わなければ アプリケーションは 高 い 性 能 を 発 揮 できるでしょう たとえば 条 件 に 応 じた 多 くの 部 分 から 成 る 大 規 模 なシェーダよりも 特 定 のレンダリング 処 理 に 特 化 した 小 規 模 なものにしてください シェーダ 内 の 分 岐 の 数 を 減 らすか 作 成 するシェーダの 数 を 増 やすかは トレードオフです さまざまなオプションをテストし 最 も 高 速 なものを 選 びます シェーダで 分 岐 を 使 用 しなければならない 場 合 は 次 の 推 奨 事 項 に 従 ってください ベストプラクティス: シェーダのコンパイル 時 にわかっているconstantに 対 して 分 岐 する 許 容 : uniform 変 数 に 対 して 分 岐 する 速 度 低 下 の 可 能 性 :シェーダ 内 で 計 算 された 値 に 対 して 分 岐 する 108
109 シェーダのベストプラクティス シェーダ 内 での 計 算 の 代 わりにuniformまたはconstantを 使 用 する ループをなくす ループを 展 開 するか ベクトルを 使 用 して 演 算 を 実 行 することによって 多 くのループをなくすこと ができます たとえば 次 のコードは 非 常 に 非 効 率 的 です int i; float f; vec4 v; for(i = 0; i < 4; i++) v[i] += f; 同 じ 演 算 を コンポーネントレベルの 加 算 を 直 接 使 用 して 実 行 できます float f; vec4 v; v += f; ループを 排 除 できない 場 合 は ループに 定 数 の 上 限 を 設 けて 動 的 な 分 岐 を 避 けるのが 良 いでしょう シェーダにおける 配 列 インデックスの 計 算 を 避 ける シェーダ 内 で 計 算 されるインデックスを 使 用 すると constantまたはuniformの 配 列 インデックスを 使 用 するよりもコストが 高 くつきます 通 常 uniform 配 列 へのアクセスは 一 時 配 列 へのアクセスと 比 べ てコストはかかりません 動 的 なテクスチャ 検 索 に 注 意 する 動 的 なテクスチャ 検 索 は 従 属 テクスチャ 読 み 込 みとも 呼 ばれ フラグメントシェーダが シェー ダに 渡 された 修 正 されていないテクスチャ 座 標 を 使 用 するのではなく テクスチャ 座 標 を 計 算 する 場 合 に 発 生 します 従 属 テクスチャリードはOpenGL ES 3.0 対 応 のハードウェアではパフォーマンス 上 の 負 担 なしでサポートされます 他 のデバイス 上 の 従 属 リードでは テクセルデータの 読 み 込 みに 遅 延 が 生 じ パフォーマンスが 低 下 する 可 能 性 があります シェーダが 従 属 テクスチャ 読 み 込 みを 行 わ ない 場 合 は グラフィックスハードウェアがシェーダの 実 行 前 にテクセルデータを 事 前 に 取 得 し メ モリアクセスの 待 ち 時 間 を 感 じさせない 可 能 性 があります リスト 10-7は 新 しいテクスチャ 座 標 を 計 算 するフラグメントシェーダを 示 しています この 例 の 計 算 は 頂 点 シェーダでは 簡 単 に 実 行 できます 計 算 を 頂 点 シェーダに 移 動 し 頂 点 シェーダが 計 算 し たテクスチャ 座 標 を 直 接 使 用 することで 従 属 テクスチャ 読 み 込 みを 避 けることができます 109
110 シェーダのベストプラクティス プログラマブルブレンディング 用 にフレームバッファのデータを 取 得 する 注 意 : わかりにくいかもしれませんが テクスチャ 座 標 に 関 する 計 算 はどれも 従 属 テクス チャ 読 み 込 みとしてカウントされます たとえば テクスチャ 座 標 の 複 数 のセットを1つの varyingパラメータに 包 み スウィズルコマンドを 使 用 してテクスチャ 座 標 を 抽 出 しても 従 属 テクスチャ 読 み 込 みが 発 生 します リスト 10-7 従 属 テクスチャ 読 み 込 み varying vec2 vtexcoord; uniform sampler2d texturesampler; void main() { vec2 modifiedtexcoord = vec2(1.0 - vtexcoord.x, vtexcoord.y); gl_fragcolor = texture2d(texturesampler, modifiedtexcoord); } プログラマブルブレンディング 用 にフレームバッファのデー タを 取 得 する OpenGLやOpenGL ESの 従 来 の 実 装 には 固 定 機 能 ブレンディングステージがありました( 図 10-1を 参 照 ) 描 画 関 数 を 呼 び 出 す 前 に ブレンディング 操 作 を 取 りうるパラメータとして 固 定 された 集 合 の 中 から 指 定 します フラグメントシェーダがピクセルの 色 データを 出 力 した 後 OpenGL ESのブレ ンディングステージは デスティネーションフレームバッファの 対 応 するピクセルに 当 たる 色 データ を 取 得 し 指 定 されたブレンディング 操 作 を 施 して2つを 混 ぜ 合 わせ 最 終 的 な 色 として 出 力 します 図 10-1 従 来 型 の 固 定 機 能 ブレンディング 110
111 シェーダのベストプラクティス プログラマブルブレンディング 用 にフレームバッファのデータを 取 得 する ios 6.0 以 降 EXT_shader_framebuffer_fetch 拡 張 機 能 を 使 って プログラマブルブレンディングそ の 他 の 効 果 を 実 装 できるようになりました 元 の 色 をOpenGLに 供 給 してブレンドするのではなく フラグメントシェーダ 側 で 処 理 するべきフラグメントに 対 応 するデスティネーションフレームバッ ファの 内 容 を 読 み 込 みます したがってフラグメントシェーダは どのようなアルゴリズムでも 自 由 に 適 用 して 最 終 的 な 色 を 決 めることができるのです( 図 10-2を 参 照 ) 図 10-2 プログラマブルブレンディングとフレームバッファのデータ 取 得 この 拡 張 機 能 により 各 種 の 高 度 なレンダリング 技 法 が 使 えるようになります 追 加 のブレンディングモード 色 を 混 合 する 独 自 のGLSL ES 関 数 を 定 義 することにより OpenGL ES 固 定 機 能 ブレンディングステージでは 不 可 能 だったブレンディングモードを 実 装 できます リ スト 10-8 (112 ページ)に OverlayおよびDifferenceという 各 種 グラフィックスソフトウェアに よくあるブレンディングモードの 実 装 例 を 示 します 効 果 の 後 処 理 シーンのレンダリング 後 フラグメントシェーダで 現 在 のフラグメント 色 を 取 得 し 変 換 を 施 して 新 しい 色 を 出 力 する という 方 法 で 全 画 面 を 占 める 四 角 形 を 描 画 できます リスト 10-9 (113 ページ)に 示 すシェーダは この 方 式 により シーンをグレイスケールに 変 換 します 色 以 外 のフラグメントに 対 する 操 作 フレームバッファには 色 以 外 のデータを 収 容 することもあ ります たとえば 遅 延 シェーディングアルゴリズムでは 複 数 のレンダターゲットを 使 って 深 度 や 法 線 の 情 報 を 格 納 します フラグメントシェーダは あるレンダターゲットからこのような データを 取 得 し 別 のレンダターゲットに 色 を 出 力 できます こういった 効 果 は フレームバッファを 取 得 する 拡 張 機 能 がなくても 実 現 できます たとえばグレー スケール 変 換 は シーンをテクスチャにレンダリングし このテクスチャと テクセル 色 をグレース ケールに 変 換 するフラグメントシェーダを 使 って 全 画 面 を 占 める 四 角 形 を 描 画 すればよいのです しかしこの 拡 張 機 能 を 使 えば 多 くの 場 合 性 能 を 改 善 できます 111
112 シェーダのベストプラクティス プログラマブルブレンディング 用 にフレームバッファのデータを 取 得 する この 機 能 を 有 効 にするためには フラグメントシェーダに EXT_shader_framebuffer_fetch 拡 張 機 能 を 使 う 旨 の 宣 言 が 必 要 です(リスト 10-8 リスト 10-9を 参 照 ) 実 装 コードの 書 き 方 は OpenGL ES Shading Language(GLSL ES)の 版 によって 異 なります フレームバッファを 取 得 する(GLSL ES 1.0の 場 合 ) OpenGL ES 2.0やOpenGL ES 3.0であっても #version 300 es という 記 述 子 を 使 わない 場 合 は 組 み 込 み 変 数 gl_fragcolorおよびgl_lastfragdataを フラグメントシェーダの 出 力 用 フレーム バッファの 読 み 取 り 用 としてそれぞれ 使 います(リスト 10-8を 参 照 ) リスト 10-8 プログラマブルブレンディングをおこなうフラグメントシェーダの GLSL ES 1.0による 実 装 例 #extension GL_EXT_shader_framebuffer_fetch : require #define kblendmodedifference 1 #define kblendmodeoverlay 2 #define BlendOverlay(a, b) ( (b<0.5)? (2.0*b*a) : ( *(1.0-a)*(1.0-b)) ) uniform int blendmode; varying lowp vec4 sourcecolor; void main() { lowp vec4 destcolor = gl_lastfragdata[0]; if (blendmode == kblendmodedifference) { gl_fragcolor = abs( destcolor - sourcecolor ); } else if (blendmode == kblendmodeoverlay) { gl_fragcolor.r = BlendOverlay(sourceColor.r, destcolor.r); gl_fragcolor.g = BlendOverlay(sourceColor.g, destcolor.g); gl_fragcolor.b = BlendOverlay(sourceColor.b, destcolor.b); gl_fragcolor.a = sourcecolor.a; } else { // normal blending gl_fragcolor = sourcecolor; } } 112
113 シェーダのベストプラクティス 頂 点 シェーダで より 大 容 量 のメモリバッファとしてテクスチャを 使 う フレームバッファを 取 得 する(GLSL ES 3.0の 場 合 ) GLSL ES 3.0では 修 飾 子 outをつけて 宣 言 したユーザ 定 義 変 数 を フラグメントシェーダの 出 力 用 と して 使 えます 修 飾 子 inoutをつければ フラグメントシェーダの 実 行 時 に フレームバッファの データが 収 容 されるようになります リスト 10-9に inout 変 数 を 使 って グレースケール 後 処 理 技 法 を 実 装 した 例 を 示 します リスト 10-9 色 の 後 処 理 を 施 すフラグメントシェーダの GLSL ES 3.0による 実 装 例 #version 300 es #extension GL_EXT_shader_framebuffer_fetch : require layout(location = 0) inout lowp vec4 destcolor; void main() { lowp float luminance = dot(vec3(0.3, 0.59, 0.11), destcolor.rgb); destcolor.rgb = vec3(luminance); } 頂 点 シェーダで より 大 容 量 のメモリバッファとしてテクス チャを 使 う ios 7.0 以 降 頂 点 シェーダは 現 在 バインドされているテクスチャユニットを 読 み 込 めるようになり ました この 技 法 により 頂 点 処 理 の 際 より 大 容 量 のメモリバッファにアクセスできるので 高 度 なレンダリング 技 法 を 高 性 能 で 実 行 できます 適 用 可 能 な 技 法 として たとえば 次 のようなものがあ ります 変 位 マッピング 既 定 の 頂 点 位 置 でメッシュを 描 画 した 後 頂 点 シェーダのテクスチャから 各 頂 点 を 読 み 込 んで 位 置 を 変 えます リスト 10-10に この 技 法 を 使 って グレースケールの 高 さマッ プテクスチャから3 次 元 ジオメトリを 生 成 する 例 を 示 します インスタンス 描 画 法 インスタンス 描 画 法 により 描 画 関 数 の 呼 び 出 し 回 数 を 減 らす (76 ペー ジ)で 説 明 したように よく 似 たオブジェクトが 多 数 並 んだシーンをレンダリングする 際 CPU のオーバーヘッドを 大 幅 に 削 減 できます しかし インスタンスごとに 異 なる 情 報 を 頂 点 シェー ダに 供 給 する 方 法 は 判 断 が 難 しいかも 知 れません テクスチャには 多 くのインスタンスに 関 す るさまざまな 情 報 を 格 納 できます たとえば 広 大 な 都 市 景 観 を 単 なる 立 方 体 を 記 述 するだけの 113
114 シェーダのベストプラクティス 頂 点 シェーダで より 大 容 量 のメモリバッファとしてテクスチャを 使 う 頂 点 データから 数 百 ものインスタンスを 描 画 する という 方 法 でレンダリングできます 頂 点 シェーダはgl_InstanceID 変 数 を 使 い テクスチャからサンプリングして それぞれのインスタ ンス( 建 物 )に 適 用 する 変 換 行 列 色 テクスチャ 座 標 オフセット 高 さなどを 求 めます リスト 高 さマップからレンダリングする 頂 点 シェーダ attribute vec2 xzpos; uniform mat4 modelviewprojectionmatrix; uniform sampler2d heightmap; void main() { // Use the vertex X and Z values to look up a Y value in the texture. vec4 position = texture2d(heightmap, xzpos); // Put the X and Z values into their places in the position vector. position.xz = xzpos; } // Transform the position vector from model to clip space. gl_position = modelviewprojectionmatrix * position; (OpenGL ES 3.0で 導 入 された)ユニフォーム 配 列 やユニフォームバッファオブジェクトを 使 って 大 量 のデータを 頂 点 シェーダに 供 給 することもできますが 頂 点 テクスチャを 使 う 方 法 にも 状 況 によっ ては 長 所 があります テクスチャには ユニフォーム 配 列 やユニフォームバッファオブジェクトより も 多 くのデータを 格 納 でき また ラッピングやフィルタリングの 機 能 により データを 補 間 するこ とも 可 能 です さらに テクスチャにレンダリングすることにより この 後 の 頂 点 処 理 ステージで 使 うデータをGPUで 生 成 できる という 利 点 があります デバイス 上 で 頂 点 テクスチャのサンプリングが 可 能 かどうか( 可 能 な 場 合 は 頂 点 シェーダが 使 える テクスチャユニット 数 ) 実 行 時 にMAX_VERTEX_TEXTURE_IMAGE_UNITSの 制 限 値 を 確 認 してくださ い( 詳 しくは OpenGL ESの 機 能 の 検 証 (16 ページ)を 参 照 ) 114
115 並 列 処 理 とOpenGL ES 並 列 処 理 とは コンピューティングにおいては 通 常 複 数 のプロセッサ 上 で 同 時 にタスクを 実 行 する ことを 指 します 作 業 を 並 行 して 実 行 することで タスクがより 短 時 間 で 完 了 し ユーザから 見 たア プリケーションの 応 答 性 が 高 まります しっかりした 設 計 のOpenGL ESアプリケーションには 具 体 的 な 形 の 並 列 処 理 すなわちCPU 上 でのアプリケーションの 処 理 とGPU 上 でのOpenGL ESの 処 理 の 並 列 処 理 が 見 られます OpenGL ES 設 計 ガイドライン (52 ページ)で 紹 介 する 技 法 の 多 くは 特 に CPUとGPUの 間 での 優 れた 並 列 処 理 を 実 現 するOpenGLアプリケーションの 作 成 を 狙 いとしています 並 列 処 理 アプリケーションを 設 計 するということは 作 業 をサブタスクに 分 解 し 並 行 して 安 全 に 実 行 できるタスクと 順 番 に 実 行 しなければならないタスクを 特 定 することを 意 味 します つまり ほ かのタスクが 使 用 するリソース またはほかのタスクから 返 された 結 果 のどちらかに 依 存 するタスク を 特 定 することを 意 味 します iosにおける 各 プロセスは 1つ 以 上 のスレッドで 構 成 されています スレッドとは プロセスのため のコードを 実 行 する 実 行 の 流 れのことです Appleは 従 来 のスレッドと Grand Central Dispatch (GCD)と 呼 ばれる 機 能 の 両 方 を 提 供 します Grand Central Dispatchを 使 用 すると スレッドを 手 動 で 管 理 せずにタスクをサブタスクに 分 解 することができます Grand Central Dispatchは デバイス 上 で 利 用 可 能 なコア 数 に 基 づいてスレッドを 割 り 当 て それらのスレッドに 対 して 自 動 的 にタスクのス ケジューリングを 行 います より 高 いレベルでは Cocoa TouchがNSOperationとNSOperationQueueを 提 供 して 作 業 単 位 の 作 成 とスケジューリングのためのObjective-C 抽 象 化 を 可 能 にしています この 章 ではこれらのテクノロジーは 詳 しく 取 り 上 げません OpenGL ESアプリケーションに 並 列 処 理 を 追 加 する 方 法 を 検 討 する 前 に Concurrency Programming Guide をお 読 みください スレッドを 手 動 で 管 理 する 場 合 は Threading Programming Guide もお 読 みください 使 用 するテクニックに 関 係 なく マルチスレッドシステム 上 でOpenGL ESを 呼 び 出 す 場 合 に 追 加 の 制 限 があります この 章 は マルチスレッドによってOpenGL ESアプリケーションのパフォーマンスが 向 上 する 場 合 OpenGL ES がマルチスレッドアプリケーション 課 す 制 限 そしてOpenGL ESアプリケーションに 並 列 処 理 を 実 装 するために 使 用 できる 一 般 的 な 設 計 方 法 を 理 解 するのに 役 立 ちます 並 列 処 理 のメリットがあるかどうか 判 断 する マルチスレッドアプリケーションの 作 成 では アプリケーションの 設 計 実 装 テストにおいてかな りの 労 力 が 必 要 です スレッドもアプリケーションに 複 雑 さとオーバーヘッドを 追 加 する 要 素 です アプリケーションはワーカースレッドに 渡 すことができるようデータをコピーする 必 要 のある 場 合 が 115
116 並 列 処 理 とOpenGL ES OpenGL ESは 各 コンテキストを 単 一 スレッドに 制 限 あり 複 数 のスレッドは 同 一 リソースへのアクセスを 同 期 する 必 要 の 生 じる 場 合 があります OpenGL ESアプリケーションに 並 列 処 理 を 実 装 しようとする 前 に OpenGL ES 設 計 ガイドライン (52 ペー ジ)で 説 明 するテクニックを 使 用 して まず 単 一 スレッド 環 境 でOpenGL ESコードを 最 適 化 します 最 初 は CPUとGPUの 効 率 的 な 並 列 処 理 の 達 成 に 焦 点 を 合 わせ その 後 で 並 列 プログラミングによっ てパフォーマンスを 向 上 できるかどうかについて 評 価 します 並 列 処 理 に 適 した 候 補 には 次 に 示 す 特 性 のどちらか またはその 両 方 が 備 わっています アプリケーションが OpenGL ESのレンダリングに 依 存 しない 多 くのタスクをCPU 上 で 実 行 する たとえば ゲームは ゲームの 世 界 をシミュレートし コンピュータに 操 られる 敵 の 人 工 知 能 を 計 算 し サウンドを 再 生 します このシナリオでは タスクの 多 くがOpenGL ESの 描 画 コードに 依 存 していないため 並 列 処 理 を 活 用 できます アプリケーションのプロファイルを 調 べた 結 果 OpenGL ESのレンダリングコードがCPUで 多 くの 時 間 を 費 やしていることがわかった このシナリオでは アプリケーションがGPUに 十 分 な 速 さ でコマンドを 送 信 できていないため GPUはアイドル 状 態 です CPUに 結 び 付 けられているコー ドがすでに 最 適 化 されている 場 合 は 並 行 して 実 行 されるタスクへと 作 業 内 容 を 分 割 することに より アプリケーションのパフォーマンスを 向 上 できる 可 能 性 があります アプリケーションがGPUを 待 機 してブロックされている 場 合 で OpenGL ESによる 描 画 と 並 行 して 実 行 可 能 な 作 業 がない 場 合 そのアプリケーションは 並 列 処 理 に 適 した 候 補 ではありません CPUとGPU の 両 方 がアイドル 状 態 の 場 合 OpenGL ESのニーズはおそらく それ 以 上 のチューニングの 必 要 がな いほどシンプルです OpenGL ESは 各 コンテキストを 単 一 スレッドに 制 限 iosにおけるスレッドにはそれぞれ 単 一 で 現 在 のOpenGL ESレンダリングコンテキストがあります アプリケーションがOpenGL ES 関 数 を 呼 び 出 すごとに OpenGL ESは 現 在 のスレッドに 関 連 付 けられて いるコンテキストを 暗 黙 的 に 参 照 し そのコンテキストに 関 連 付 けられている 状 態 またはオブジェク トを 修 正 します OpenGL ESは 再 入 可 能 ではありません 複 数 のスレッドに 関 連 付 けられている 同 じコンテキストを 同 時 に 修 正 する 場 合 結 果 は 予 測 できません アプリケーションがクラッシュする 可 能 性 もあれば レ ンダリングが 正 常 に 行 われない 可 能 性 もあります 何 らかの 理 由 で 複 数 のスレッドが 同 じコンテキス トをターゲットとするよう 設 定 することにした 場 合 は そのコンテキストに 対 するすべてのOpenGL ES 呼 び 出 しにミューテックスを 配 置 して スレッドを 同 期 させなければなりません ブロック 状 態 にな るOpenGL ESコマンド(glFinishなど)は スレッドを 同 期 しません 116
117 並 列 処 理 とOpenGL ES OpenGL ESアプリケーションに 並 列 処 理 を 実 装 する 方 法 Grand Central DispatchおよびNSOperationQueueオブジェクトは 選 択 したスレッド 上 でタスクを 実 行 することができます これらは そのタスク 専 用 のスレッドを 作 成 する 場 合 もあれば 既 存 のス レッドを 再 利 用 する 場 合 もあります しかし どちらの 場 合 でも どのスレッドがタスクを 実 行 する か 保 証 できません これは OpenGL ESアプリケーションにとっては 次 の 意 味 を 持 ちます 各 タスクは OpenGL ESコマンドを 実 行 する 前 にコンテキストを 設 定 しなければならない 同 じコンテキストを 評 価 する2つのタスクを 自 動 に 実 行 することはできない 各 タスクは 終 了 する 前 にスレッドのコンテキストを 消 去 する 必 要 がある OpenGL ESアプリケーションに 並 列 処 理 を 実 装 する 方 法 並 列 処 理 が 可 能 なOpenGL ESアプリケーションは OpenGL ESがより 多 くの 作 業 をGPUに 提 供 できるよ う CPUの 並 列 処 理 に 焦 点 を 合 わせるべきです OpenGL ESアプリケーションに 並 列 処 理 を 実 装 する ときの 推 奨 事 項 を 次 に 示 します アプリケーションを 同 時 に 実 行 可 能 なOpenGL ESのタスクとOpenGL ES 以 外 のタスクに 分 解 す る OpenGL ESの 描 画 コードは 単 一 のタスクとして 実 行 されます そのため OpenGL ESの 描 画 コードは 単 一 のスレッドで 実 行 されます この 方 法 は アプリケーションに 大 量 のCPU 処 理 を 必 要 とするほかのタスクがある 場 合 に 最 も 有 効 です 処 理 性 能 のプロファイリングにより OpenGL 内 でかなりのCPU 時 間 を 費 やしていることが 分 かっ た 場 合 は OpenGL ESコンテキストのマルチスレッド 処 理 を 有 効 にして 処 理 の 一 部 を 別 のスレッ ドに 移 動 してください この 方 法 には 簡 単 であるという 利 点 があります マルチスレッドを 有 効 にするコードは1 行 だけで 済 みます マルチスレッド 化 したOpenGL ES (118 ページ)を 参 照 し てください アプリケーションがOpenGL ESに 送 るデータの 準 備 に 大 量 のCPU 時 間 を 費 やす 場 合 は レンダリン グデータを 準 備 するタスクと レンダリングコマンドをOpenGL ESに 送 信 するタスクとに 作 業 を 分 割 することができます ワーカータスクにおけるOpenGL ES 演 算 の 実 行 (118 ページ)を 参 照 してください 同 時 にレンダリング 可 能 な 複 数 のシーンがある 場 合 または 複 数 のコンテキストで 実 行 可 能 な 作 業 がある 場 合 アプリケーションは 複 数 のタスクを 作 成 し 1つのタスクに1つのOpenGL ESコン テキストを 設 定 します 複 数 のコンテキストが 同 じアートアセットにアクセスする 場 合 は sharegroupを 使 用 して コンテキスト 間 でOpenGL ESオブジェクトを 共 有 します 複 数 のOpenGL ES コンテキストの 使 用 (119 ページ)を 参 照 してください 117
118 並 列 処 理 とOpenGL ES マルチスレッド 化 したOpenGL ES マルチスレッド 化 したOpenGL ES アプリケーションがOpenGL ESの 関 数 を 呼 び 出 すと OpenGL ESは 渡 されたパラメータを ハードウェ アが 理 解 できる 形 式 に 変 換 します このコマンド 処 理 に 要 する 時 間 は 入 力 がはじめからハードウェ アに 合 った 形 式 か 否 かによって 異 なりますが いずれにしてもオーバーヘッドはあります OpenGL ES 内 の 計 算 処 理 に 多 くの 時 間 を 費 やしている 場 合 適 切 なデータ 形 式 を 既 に 採 用 しているの であれば OpenGL ESのコンテキストをマルチスレッド 化 することにより 相 応 の 利 益 が 得 られるで しょう マルチスレッド 化 したOpenGL ESコンテキストは 自 動 的 にワーカースレッドを 生 成 し 計 算 の 一 部 をこのスレッドに 委 ねます マルチコアデバイスの 場 合 マルチスレッド 化 すると CPU 側 で 実 行 するOpenGL ES 内 部 の 計 算 はアプリケーションと 並 列 におこなわれ 性 能 向 上 につながります ただし 同 期 型 の 関 数 はこれまでどおり 呼 び 出 し 元 スレッドをブロックします OpenGL ESをマルチスレッド 化 するためには EAGLContextオブジェクトのmultiThreadedプロパティ をYESと 設 定 します 注 意 : マルチスレッド 実 行 の 有 効 / 無 効 を 切 り 替 えると OpenGL ESはそれまでのコマンドを フラッシュしてしまうほか 追 加 のスレッドを 用 意 するためのオーバーヘッドも 発 生 しま す 切 り 替 えはレンダリングループ 内 ではなく 初 期 化 関 数 でおこなうようにしてくださ い マルチスレッド 化 した 場 合 OpenGL ESはパラメータを 複 製 し ワーカースレッドに 転 送 しなければ なりません このようなオーバーヘッドがあるので マルチスレッド 化 の 有 無 により どちらが 高 速 に 処 理 できるか 必 ずテストするようにしてください このオーバーヘッドは OpenGL ESの 使 い 方 を 工 夫 してアプリケーションに 実 装 することにより 最 小 限 に 抑 えることができます 以 下 これにつ いて 詳 しく 説 明 します ワーカータスクにおけるOpenGL ES 演 算 の 実 行 一 部 のアプリケーションは OpenGL ESにデータを 渡 す 前 に そのデータについて 大 量 の 演 算 を 実 行 します たとえば 新 たなジオメトリを 作 成 したり 既 存 のジオメトリをアニメーション 化 したりす るアプリケーションが 該 当 します 可 能 な 場 合 は そのような 演 算 はOpenGL ES 内 部 で 実 行 します これは GPU 内 部 で 利 用 できるすぐれた 並 列 処 理 を 活 かしており アプリケーションとOpenGL ESの 間 における 結 果 のコピーに 伴 うオーバーヘッドを 削 減 します 図 6-6 (60 ページ)に 示 す 手 法 は OpenGL ESオブジェクトの 更 新 と それらオブジェクトを 使 用 す るレンダリングコマンドの 実 行 を 交 互 に 実 行 するものです OpenGL ESはGPU 上 でレンダリングを 実 行 し 並 行 してCPU 上 ではアプリケーションの 更 新 を 実 行 します CPU 上 で 実 行 される 演 算 が GPU 上 の 演 算 よりも 処 理 時 間 がかかってしまうと それだけGPUのアイドル 時 間 が 長 くなります このよ 118
119 並 列 処 理 とOpenGL ES 複 数 のOpenGL ESコンテキストの 使 用 うな 状 況 では 複 数 CPUを 搭 載 するシステムの 並 列 処 理 を 利 用 できる 場 合 があります OpenGL ESレ ンダリングコードを 別 の 演 算 や 処 理 タスクに 分 割 して それらを 並 行 して 実 行 します 1つ 目 のタス クは 2つ 目 のタスクが 使 用 し OpenGLに 送 信 するデータを 生 成 します 最 高 のパフォーマンスを 得 るため タスク 間 におけるデータのコピーを 避 けます 1つのタスクでデー タを 計 算 し 計 算 結 果 をほかのタスクの 頂 点 バッファオブジェクトにコピーする 代 わりに セット アップコードで 頂 点 バッファオブジェクトをマッピングし ポインタを 直 接 ワーカータスクに 渡 しま す 修 正 タスクをサブタスクへとさらに 分 解 できる 場 合 は さらにメリットの 得 られる 可 能 性 がありま す たとえば 2つ 以 上 の 頂 点 バッファオブジェクトがあると 仮 定 し 描 画 コマンドを 送 信 する 前 に それぞれのオブジェクトを 更 新 する 必 要 があるとします 各 オブジェクトは ほかのオブジェクトに 関 係 なく 計 算 し 直 すことが 可 能 です このシナリオでは 各 バッファに 対 する 修 正 が 演 算 となり NSOperationQueueオブジェクトを 使 用 して 作 業 を 管 理 します 1. 現 在 のコンテキストを 設 定 します 2. 最 初 のバッファをマッピングします 3. そのバッファを 埋 めることがタスクとなるNSOperationオブジェクトを 作 成 します 4. その 演 算 を 演 算 キューに 追 加 します 5. ほかのバッファについても 手 順 2から 手 順 4を 実 行 します 6. 演 算 キューに 対 してwaitUntilAllOperationsAreFinishedを 呼 び 出 します 7. バッファのマッピングを 解 除 します 8. レンダリングコマンドを 実 行 します 複 数 のOpenGL ESコンテキストの 使 用 複 数 のコンテキストを 使 用 する 場 合 の 一 般 的 な 手 法 とは 各 コンテキストが 別 々のスレッドで 実 行 さ れている 状 態 で ほかのコンテキストがOpenGL ESオブジェクトを 使 用 している 間 にOpenGL ESオブ ジェクトを 更 新 する1つのコンテキストを 持 つことです 各 コンテキストは 別 々のスレッド 上 で 実 行 されるため コンテキストのアクションがほかのコンテキストにブロックされることはめったにあり ません これを 実 装 するには アプリケーションにおいて2つのコンテキストと2つのスレッドを 作 成 し 各 スレッドが1つのコンテキストを 制 御 するようにします さらに 2つ 目 のスレッド 上 でアプリ ケーションが 更 新 しようとするOpenGL ESオブジェクトは 二 重 にバッファに 格 納 しなければなりま せん これは オブジェクトを 使 用 する 側 のスレッドが もう 一 方 のスレッドがOpenGL ESオブジェ クトを 修 正 している 間 は OpenGL ESオブジェクトにアクセスできない 可 能 性 があるからです コン テキスト 間 の 変 更 を 同 期 するプロセスは EAGL sharegroupはコンテキストのopengl ESオブジェクト を 管 理 (21 ページ)で 詳 しく 説 明 しています 119
120 並 列 処 理 とOpenGL ES OpenGL ESアプリケーションのスレッド 化 に 関 するガイドライン GLKTextureLoaderクラスは この 方 法 を 実 装 して テクスチャデータの 非 同 期 読 み 込 みを 実 行 しま す ( GLKitフレームワークを 使 用 したテクスチャデータの 読 み 込 み (97 ページ)を 参 照 してくだ さい ) OpenGL ESアプリケーションのスレッド 化 に 関 するガイドライ ン OpenGL ESを 使 用 するアプリケーションでのスレッド 化 を 成 功 させるには 次 のガイドラインに 従 っ てください 1つのコンテキストにつき1つのスレッドだけを 使 用 する 特 定 のコンテキストのためのOpenGL ES コマンドはスレッドセーフではありません 決 して 複 数 のスレッドが 単 一 のコンテキストに 同 時 にアクセスしないようにしてください Grand Central Dispatchを 使 用 するときは 専 用 のシリアルキューを 使 用 してOpenGL ESにコマンド をディスパッチする このキューは 従 来 のミューテックスパターンを 置 き 換 えるために 使 用 で きます 現 在 のコンテキストを 追 跡 する スレッドを 切 り 替 えるとき 何 も 考 えずにコンテキストを 切 り 替 えることは 簡 単 ですが それによりグラフィックスコマンドの 実 行 に 予 期 しない 影 響 が 生 じま す 新 たに 作 成 されたスレッドに 切 り 替 えるときは 現 在 のコンテキストを 設 定 し 元 のスレッド を 離 れる 前 に 現 在 のコンテキストを 消 去 しておかなければなりません 120
121 OpenGL ES 3.0への 移 行 OpenGL ES 3.0はOpenGL ES 2.0の 仕 様 を 包 含 しているので 比 較 的 容 易 に 移 行 できます OpenGL ES 2.0 用 のコードのままでも デバイスがOpenGL ES 3.0に 対 応 していれば リソースの 制 限 が 緩 和 されま す また アプリケーションの 設 計 によっては OpenGL ES 3.0で 正 式 に 採 用 された 機 能 も 追 加 機 能 として 利 用 できます OpenGL ES 3.0に 移 行 するためのチェックリスト OpenGL ES 3.0を 利 用 するために アプリケーションに 施 す 修 正 事 項 を 示 します 1. OpenGL ESコンテキストを 生 成 し( OpenGL ESコンテキストの 設 定 (19 ページ)を 参 照 ) API の 版 を 表 す 定 数 として OpenGL ES 3.0に 対 応 するものを 指 定 します EAGLContext *context = [[EAGLContext alloc] initwithapi:keaglrenderingapiopengles3]; OpenGL ES 3.0に 未 対 応 のデバイスでも 動 作 するようにしたい 場 合 は リスト 2-1 (20 ページ)に 従 い 必 要 ならばOpenGL ES 2.0に 降 格 して 動 作 するようにしてください 2. OpenGL ES 3.0のAPIを 使 うソースファイルには 対 応 するヘッダファイルをインクルードあるいは インポートする 旨 の 記 述 を 追 加 します #import <OpenGLES/ES3/gl.h> #import <OpenGLES/ES3/glext.h> 3. OpenGL ES 2.0の 拡 張 機 能 のうち OpenGL ES 3.0の 仕 様 に 取 り 込 まれ あるいは 変 更 されたものを 使 っているコードは 以 下 の 拡 張 機 能 のコードを 改 訂 する に 従 って 改 訂 してください 4. ( 必 要 な 場 合 のみ)シェーダプログラムはそのままで OpenGL ES 2.0と3.0のどちらでも 使 えま す ただし 新 機 能 を 利 用 するため GLSL ES 3.0で 記 述 し 直 す 場 合 は OpenGL ESシェーディン グ 言 語 の 第 3.0 版 に 移 行 する (124 ページ)に 示 した 注 意 事 項 を 頭 に 入 れておいてください 5. OpenGL ES 3.0に 対 応 したデバイス 上 で アプリケーションが 正 しく 動 作 するかどうか 確 認 しま す 121
122 OpenGL ES 3.0への 移 行 拡 張 機 能 のコードを 改 訂 する 拡 張 機 能 のコードを 改 訂 する OpenGL ES 3.0はOpenGL ES 2.0の 仕 様 を 包 含 しているので OpenGL ES 2.0のコア 機 能 しか 使 っていない アプリケーションは そのままOpenGL ES 3.0のコンテキストでも 動 作 します しかし OpenGL ES 2.0 の 拡 張 機 能 を 使 っているアプリケーションもあります OpenGL ES 3.0でも 同 じ 機 能 が 使 えますが 多 少 のコード 変 更 を 要 するかも 知 れません 拡 張 機 能 の 接 尾 辞 を 除 去 する 以 下 に 挙 げるOpenGL ES 2.0の 拡 張 機 能 のAPIは OpenGL ES 3.0のコア 仕 様 に 組 み 込 まれています た だし OpenGL ES 3.0のコンテキストで 利 用 するためには 関 数 や 定 数 の 名 前 から 拡 張 機 能 であるこ とを 表 す 接 尾 辞 を 除 去 する 必 要 があります たとえば 関 数 glmapbufferrangeextの 名 前 は glmapbufferrangeに 定 数 DEPTH_COMPONENT24_OES(glRenderbufferStorage 関 数 の internalformat 引 数 として 使 用 )の 名 前 はDEPTH_COMPONENT24となります OES_depth24 OES_element_index_uint OES_fbo_render_mipmap OES_rgb8_rgba8 OES_texture_half_float_linear OES_vertex_array_object EXT_blend_minmax EXT_draw_instanced EXT_instanced_arrays EXT_map_buffer_range EXT_occlusion_query_boolean EXT_texture_storage APPLE_sync APPLE_texture_max_level 拡 張 機 能 APIの 使 い 方 を 修 正 する OpenGL ES 2.0の 拡 張 機 能 の 中 には OpenGL ES 3.0のコア 仕 様 に 取 り 込 まれたとき APIの 定 義 が 変 わっ ているものがあります その 場 合 は 以 下 のように 修 正 してください 122
123 OpenGL ES 3.0への 移 行 拡 張 機 能 のコードを 改 訂 する テクスチャの 形 式 を 処 理 する OES_depth_texture OES_packed_depth_stencil OES_texture_float OES_texture_half_float EXT_texture_rg EXT_sRGBの 各 拡 張 機 能 には glteximage 系 の 関 数 の 引 数 internalformatおよびtypeに 指 定 する 定 数 が 定 義 されています ここで 定 義 されている 拡 張 機 能 は OpenGL ES 3.0ではコアAPIになっていますが いくつか 注 意 点 があります glteximage 関 数 は 大 きさを 明 示 しないinternalformat 定 数 が 使 えません 次 のように 大 き さを 明 示 した 定 数 を 使 ってください // Replace this OpenGL ES 2.0 code: glteximage2d(gl_texture_2d, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, data); // With this OpenGL ES 3.0 code: glteximage2d(gl_texture_2d, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, data); OpenGL ES 3.0には LUMINANCEデータやLUMINANCE_ALPHAデータに 用 いる 浮 動 小 数 点 型 または 半 精 度 浮 動 小 数 点 型 の 形 式 が 定 義 されていません 代 わりに 対 応 するRED 形 式 またはRG 形 式 を 使 っ てください 深 度 や 深 度 /ステンシルのテクスチャサンプラが 返 すベクトルは OpenGL ES 3.0では 先 頭 3つの 要 素 にある 深 度 値 を 繰 り 返 さないようになりました このようなテクスチャからサンプリングす るシェーダコードでは 最 初 の(.r) 要 素 のみ 使 うようにしてください srgb 形 式 を 指 定 できるのは 引 数 internalformatだけになりました srgbテクスチャの 形 式 を 表 す 引 数 には GL_RGBまたはGL_RGBAを 指 定 してください あるいは glteximage 系 の 関 数 を すべて 対 応 するglTexStorage 系 の 関 数 に 置 き 換 える という 方 法 もあります テクスチャストレージ 関 数 は OpenGL ES 3.0ではコアAPI OpenGL ES 1.1および2.0で はEXT_texture_storage 拡 張 機 能 として 提 供 されています この 関 数 族 にはほかにも gltexstorage 関 数 を1 度 呼 び 出 すだけで 状 態 不 変 のテクスチャオブジェクトを 完 全 に 指 定 できる という 利 点 が あります 整 合 性 の 検 査 やメモリ 割 り 当 てを 真 っ 先 におこなうので ミップマップレベルの 欠 落 や 一 貫 しないキューブマップフェイスにより 不 完 全 なテクスチャオブジェクトが 生 じることはありま せん バッファオブジェクトをクライアント 側 のメモリにマップする OES_mapbuffer 拡 張 機 能 には バッファオブジェクトのデータストレージ 全 体 をクライアント 側 のメ モリにマップする glmapbuffer 関 数 が 定 義 されています OpenGL ES 3.0にはこれに 代 わる glmapbufferrange 関 数 があり 機 能 が 強 化 されています バッファオブジェクトのデータストレー 123
124 OpenGL ES 3.0への 移 行 OpenGL ESシェーディング 言 語 の 第 3.0 版 に 移 行 する ジの 一 部 のみをマップすることができ さらに 非 同 期 にマッピングすることも 可 能 です glmapbufferrange 関 数 は EXT_map_buffer_range 拡 張 機 能 を 組 み 込 めば OpenGL ES 1.1および2.0の コンテキストでも 使 えます フレームバッファを 破 棄 する OpenGL ES 3.0のglInvalidateFramebuffer 関 数 は EXT_discard_framebuffer 機 能 拡 張 の gldiscardframebufferext 関 数 に 代 わるものです 引 数 や 動 作 はどちらも 同 じです マルチサンプル 機 能 を 利 用 する OpenGL ES 3.0にはAPPLE_framebuffer_multisampleの 拡 張 機 能 がすべて 組 み 込 まれていますが glresolvemultisampleframebufferapple 関 数 は 例 外 です これに 代 わるglBlitFramebuffer 関 数 は フレームバッファの 複 製 機 能 を 追 加 して 強 化 したものです マルチサンプリングバッファをリゾ ルブするには 読 み 込 み 用 と 描 画 用 のフレームバッファを 設 定 ( マルチサンプル 機 能 の 使 用 による 画 像 品 質 の 向 上 (43 ページ))した 上 で glblitframebuffer 関 数 で 読 み 込 みフレームバッファ 全 体 を 描 画 フレームバッファに 複 製 してください glblitframebuffer(0,0,w,h, 0,0,w,h, GL_COLOR_BUFFER_BIT, GL_NEAREST); 他 の 拡 張 機 能 も 多 くはOpenGL ES 3.0でもそのまま 利 用 できる iosデバイスのグラフィックスハードウェアに 搭 載 された 重 要 な 機 能 の 中 には OpenGL ES 3.0のコア 仕 様 に 入 っていないものもありますが 拡 張 機 能 として 使 うことはなお 可 能 です 実 際 に 利 用 する 際 には OpenGL ESの 機 能 の 検 証 (16 ページ)に 示 した 手 順 で 拡 張 機 能 の 有 無 を 確 認 してください (どのデバイスでどの 機 能 が 使 えるか については ios Device Compatibility Reference も 参 照 ) OpenGL ES 2.0の 拡 張 機 能 として 開 発 されたコードのうち OpenGL ES 3.0の 拡 張 機 能 としても 提 供 され ているものは OpenGL ES 3.0のコンテキストでもそのまま 動 作 します ただし 頂 点 /フラグメント シェーダ 言 語 に 改 変 を 施 す 拡 張 機 能 には ほかにも 注 意 事 項 があります( 次 の 節 を 参 照 ) OpenGL ESシェーディング 言 語 の 第 3.0 版 に 移 行 する OpenGL ES 3.0には 新 しい 版 のOpenGL ESシェーディング 言 語 (GLSL ES)が 付 属 しています OpenGL ES 3.0のコンテキストでは GLSL ESの 第 1.0 版 第 3.0 版 のどちらで 記 述 したシェーダプログラムも 動 作 します ただし ユニフォームブロック 32ビット 整 数 追 加 の 整 数 演 算 などの 新 機 能 を 使 う 場 合 は 第 3.0 版 のシェーダ(ソースコードに #version 300 es という 記 述 子 があるもの)が 必 要 で す 124
125 OpenGL ES 3.0への 移 行 OpenGL ESシェーディング 言 語 の 第 3.0 版 に 移 行 する GLSL ESの 第 1.0 版 と 第 3.0 版 では 言 語 規 約 がいくつか 変 わっています その 結 果 OpenGL ES 3.0とデ スクトップ 向 けOpenGL ES 3.3 以 降 で シェーダのソースコードの 可 搬 性 が 向 上 していますが 既 存 の コードをGLSL ES 3.0に 移 植 するためには 多 少 の 変 更 が 必 要 です 修 飾 子 attributeおよびvaryingが GLSL ES 3.0ではinとoutに 変 わりました 頂 点 シェーダで は 頂 点 属 性 にin 修 飾 子 可 変 の 出 力 にout 修 飾 子 を 指 定 します フラグメントシェーダでは 可 変 の 入 力 にin 修 飾 子 を 指 定 します GLSL ES 3.0では 組 み 込 みのフラグメント 出 力 変 数 であるgl_FragDataとgl_FragColorがなくな りました 代 わりに 独 自 のフラグメント 出 力 変 数 を out 修 飾 子 つきで 宣 言 してください GLSL ES 3.0ではテクスチャサンプリング 関 数 の 名 前 が 変 わりました サンプラの 種 類 によらず 同 じテクスチャ 関 数 名 になります たとえば 新 たに 加 わったtexture 関 数 は sampler2d 引 数 で もsamplerCube 引 数 でも 使 えます(GLSL ES 1.0ではそれぞれ texture2d texturecubeという 関 数 でした) GLSL ES 1.0の 拡 張 機 能 であるEXT_shader_texture_lod EXT_shadow_samplers OES_standard_derivativesは GLSL ESのコア 仕 様 の 一 部 になりました こういった 機 能 を 使 っている シェーダをGLSL ES 3.0に 移 植 する 場 合 対 応 するGLSL ES 3.0の 関 数 を 使 ってください EXT_shader_framebuffer_fetch 拡 張 機 能 の 動 作 が 変 わっています GLSL ES 3.0では 組 み 込 み フラグメント 出 力 変 数 であるgl_FragDataとgl_FragColorがなくなったので シェーダ 側 でフ ラグメント 出 力 変 数 を 宣 言 しなければなりません これに 対 応 して 組 み 込 み 変 数 gl_lastfragdataも GLSL ES 3.0のフラグメントシェーダにはありません 代 わりに フラグメ ント 出 力 変 数 をinout 修 飾 子 つきで 宣 言 すれば シェーダを 実 行 したとき 前 回 のフラグメント データが 格 納 されます 詳 しくは プログラマブルブレンディング 用 にフレームバッファのデータ を 取 得 する (110 ページ)を 参 照 してください GLSL ES 3.0の 全 面 的 な 概 要 は OpenGL ES Shading Language 3.0 Specification (OpenGL ES API Registry で 入 手 可 能 )を 参 照 してください 125
126 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 XcodeにはOpenGL ESアプリケーションのデバッグ 分 析 調 整 に 用 いる 各 種 ツールが 付 属 しており 開 発 のあらゆる 段 階 で 有 用 です FPS Debug Gauge および GPU Report は Xcode 上 でアプリ ケーションを 実 行 すれば 常 にGPUの 動 作 状 況 を 要 約 表 示 するようになっているので レンダラを 設 計 構 築 する 際 性 能 上 の 問 題 があればすぐに 分 かります 問 題 点 が 分 かれば フレームを 取 り 込 み OpenGL ES Frame Debuggerの 画 面 でレンダリングの 問 題 箇 所 をしぼり 込 んだ 上 で 性 能 を 損 なう 原 因 を 取 り 除 くことができます Xcode OpenGL ESの 機 能 を 有 効 に 活 用 するためには Xcodeのデバッグ 画 面 に 多 少 慣 れておく 必 要 があ るでしょう その 背 景 知 識 については Xcode Overview を 参 照 してください FPS Debug Gauge および GPU Report の 使 い 方 FPS Debug Gauge および 付 随 する GPU Report ( 図 B-1を 参 照 )は アプリケーション 実 行 中 OpenGL ESの 大 まかな 処 理 状 況 を 示 します 開 発 中 いつもこの 表 示 を 気 にしていれば 性 能 上 の 問 題 が 生 じたときすぐに 気 がついて どこに 着 目 して 調 整 すればよいか 検 討 できるでしょう 図 B-1 FPS Debug Gauge および GPU Report の 画 面 126
127 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 FPS Debug Gauge および GPU Report の 使 い 方 注 意 : FPS Debug Gauge や GPU Report の 機 能 の 中 には 表 示 リンクタイマーに 依 存 するものがあります CADisplayLinkクラスやGLKViewControllerクラスを 使 わずにOpenGL ESのアニメーション 表 示 を 実 装 している 場 合 ターゲットのフレームレートを 基 準 とした 性 能 や 正 確 なCPUフレーム 時 間 情 報 を 表 示 することはできません このツールは 次 のような 表 示 から 成 ります FPS Gauge アニメーション 表 示 のフレームレート( 単 位 :FPS frames per second)を 直 近 の 履 歴 とともに 表 示 します このゲージをクリックすると Xcodeの 主 エディタにGPUレポートが 現 れます Frames Per Second アプリケーションが 設 定 したターゲットのフレームレート( 多 くの 場 合 30 FPSまたは60 FPS)を 基 準 とした 現 在 のフレームレートを 表 示 します 青 の 扇 型 は 直 近 の 読 み 取 り 度 数 の 範 囲 を 表 します Utilization GPUの 処 理 リソースを3つに 分 け アプリケーションがそれぞれをどの 位 使 っている か 3 本 の 棒 グラフで 示 します グラフィックスハードウェアのうち 性 能 上 のボトルネックに なっている 可 能 性 が 高 い 箇 所 が 分 かります Tiler バーはジオメトリ 処 理 リソースの 利 用 率 を 表 します この 値 が 高 ければ OpenGL ESのパ イプラインのうち 頂 点 やプリミティブの 処 理 ステージが 性 能 上 のボトルネックになっている 可 能 性 があります 頂 点 シェーダの 処 理 効 率 が 悪 い 各 フレームに 描 画 する 頂 点 やプリミティブ の 数 が 多 すぎる などの 原 因 が 考 えられます Renderer バーはピクセル 処 理 リソースの 利 用 率 を 表 します この 値 が 高 ければ OpenGL ESパ イプラインのうち フラグメントやピクセルの 処 理 ステージが 性 能 上 のボトルネックになって いる 可 能 性 があります フラグメントシェーダの 処 理 効 率 が 悪 い 色 をブレンドするために 処 理 するフレームごとのフラグメント 数 が 多 すぎる などの 原 因 が 考 えられます Device バーは 上 記 2つを 含 むGPU 全 体 の 利 用 率 を 表 します Frame Time 各 フレームの 処 理 に 要 した 時 間 を CPUとGPUについて 示 します CPUとGPUが 均 衡 を 保 って 並 列 処 理 しているかどうかが 分 かります CPUの 処 理 時 間 が 多 ければ 処 理 の 一 部 をGPU 側 に 移 すことにより 性 能 を 改 善 できるかも 知 れ ません たとえば 各 フレームで よく 似 たパラメータでglDrawArraysやglDrawElementsを 何 度 も 実 行 しているならば インスタンス 描 画 法 を 導 入 することにより CPUのオーバーヘッドを 減 らせるかも 知 れません( 詳 しくは インスタンス 描 画 法 により 描 画 関 数 の 呼 び 出 し 回 数 を 減 ら す (76 ページ)を 参 照 ) GPU 処 理 時 間 が 多 ければ 処 理 の 一 部 をCPU 側 に 移 すことにより 性 能 を 改 善 できるかも 知 れま せん たとえばある 描 画 関 数 の 実 行 時 に どの 頂 点 やフラグメントでも 同 じ 結 果 になる 計 算 を シェーダが 実 行 している 場 合 CPU 側 で1 度 だけ 計 算 し ユニフォーム 変 数 を 使 ってシェーダに 渡 すとよいでしょう( シェーダ 内 での 計 算 の 代 わりにuniformまたはconstantを 使 用 する (108 ペー ジ)を 参 照 ) 127
128 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ESのフレームを 取 り 込 んで 分 析 する Program Performance フレームを 取 り 込 んだ 後 にのみ 現 れます( 以 下 の OpenGL ESのフレーム を 取 り 込 んで 分 析 する (128 ページ)を 参 照 ) 取 り 込 んだフレームをレンダリングする 際 各 シェーダプログラムが 要 した 時 間 を ミリ 秒 単 位 と レンダリングに 要 した 総 時 間 に 対 する 比 率 の 両 方 で 示 します プログラムのリストを 展 開 表 示 にすると 描 画 関 数 の 呼 び 出 し 状 況 と それ ぞれに 応 じたレンダリング 時 間 も 分 かります リストからプログラムを 選 択 すると アシスタン トエディタに 対 応 するシェーダのソースコードが 表 示 されます また 描 画 関 数 に 添 えられた 矢 印 アイコンをクリックすると フレームナビゲータ( 以 下 の ナビゲータ 領 域 (132 ページ) を 参 照 )で 該 当 する 関 数 の 呼 び 出 し 位 置 が 選 択 状 態 になります 注 意 : Program Performance ビューが 現 れるのは OpenGL ES 3.0に 対 応 したデバイス 上 でデバッグしているときに 限 ります(アプリケーションがOpenGL ES 3.0または2.0の どちらのコンテキストを 使 っていても 可 ) アプリケーションの 性 能 調 整 時 には このグラフが 最 適 化 の 役 に 立 つでしょう たとえば フ レームのレンダリング 時 間 の50%を 占 めているプログラムは 10%しか 占 めていないプログラム に 比 べ 最 適 化 による 性 能 改 善 効 果 が 高 いと 考 えられます このビューはシェーダプログラムが 費 やすフレーム 時 間 を 整 理 して 表 示 しますが そのアルゴリズムを 工 夫 することだけが 性 能 改 善 の 方 法 というわけではありません たとえば 負 荷 の 高 いシェーダプログラムを 使 う 描 画 関 数 の 呼 び 出 し 回 数 を 減 らしたり 遅 いフラグメントシェーダが 処 理 するフラグメントの 数 を 減 らした りしても 相 応 の 効 果 があります Problems & Solutions Xcodeがフレームを 取 り 込 んで 分 析 した 後 にのみ 現 れる 領 域 で( OpenGL ESのフレームを 取 り 込 んで 分 析 する (128 ページ)を 参 照 ) 分 析 中 に 見 つかった 潜 在 的 な 問 題 と 性 能 向 上 のための 推 奨 事 項 を 示 します 取 り 込 んだフレームで GLSLシェーダプログラムに 変 更 を 施 す( 以 下 の シェーダプログラムを 編 集 する (135 ページ)を 参 照 )と Frame Time および Program Performance のグラフが 拡 張 し 取 り 込 んだ 元 のフレームのベースラインレンダリング 時 間 と 編 集 後 のシェーダによる 現 在 のレンダ リング 時 間 の 両 方 を 表 示 するようになります OpenGL ESのフレームを 取 り 込 んで 分 析 する アプリケーションがOpenGL ESをどのように 使 っているか 詳 しく 調 べるために アニメーションのあ るフレームをレンダリングするために 使 う OpenGL ESの 一 連 のコマンドを 取 り 込 みます Xcodeには フレームを 取 り 込 む 手 段 がいくつか 組 み 込 まれています 128
129 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ESのフレームを 取 り 込 んで 分 析 する 手 動 の 取 り 込 み Xcode 上 でアプリケーションを 実 行 し デバッグバーの カメラ アイコン( 図 B-2を 参 照 )をクリックするか Debug メニュー 以 下 の Capture OpenGL ES Frame を 実 行 す る 方 法 です 図 B-2 Debug バーと Capture OpenGL ES Frame ボタン 注 意 : Capture OpenGL ES Frame ボタンは OpenGL ESフレームワークまたはSprite Kit フレームワークをリンクしたプロジェクトに 限 り 自 動 的 に 現 れます そうでないプロ ジェクトの 場 合 は アクティブスキームを 編 集 することにより 選 択 できます( About the Scheme Editing Dialog を 参 照 ) ブレークポイントに 到 達 したときのアクション ブレークポイントに 到 達 したときのアクション として Capture OpenGL ES Frame を 選 択 する という 方 法 です このブレークポイントにデ バッガが 到 達 すると Xcodeは 自 動 的 にフレームを 取 り 込 みます( Setting Breakpoint Actions and Options を 参 照 ) OpenGL ES Error ブレークポイントにこのアクションを 設 定 すれば ( Adding an OpenGL ES Error Breakpoint を 参 照 ) OpenGL ES Frame Debuggerで OpenGL ESエ ラーの 原 因 を 調 査 できます OpenGL ESイベントマーカ OpenGL ESのコマンドストリームにイベントマーカを 挿 入 することに より プログラム 的 にフレーム 取 り 込 みを 起 動 する 方 法 です マーカの 挿 入 は 次 のコマンドでお こないます glinserteventmarkerext(0, "com.apple.gputools.event.debug-frame") OpenGL ESクライアントがこのマーカに 到 達 すると フレームのレンダリングが 終 了 し Xcodeは 自 動 的 に このフレームのレンダリングに 使 ったコマンド 列 全 体 を 取 り 込 みます Xcodeはフレームを 取 り 込 んだ 後 OpenGL ES Frame Debuggerの 画 面 を 表 示 します ここで フレー ムのレンダリングに 用 いたOpenGL ESのコマンド 列 や OpenGL ESのリソースを 調 べることができます ( OpenGL ES Frame Debuggerひとめぐり (131 ページ)を 参 照 ) さらにXcodeは アプリケーションがOpenGL ESをどのように 使 っているか 自 動 的 に 分 析 し レンダラ やシェーダのどの 部 分 を 最 適 化 すれば 効 果 が 高 いか 調 べます この 機 能 は GPU Report 画 面 の 上 部 にある Analyze ボタンで 起 動 します( 図 B-1 (126 ページ)の 右 上 ) 129
130 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ESのフレームを 取 り 込 んで 分 析 する Analyze ボタンを 押 すと (まだであれば)Xcodeはフレームを 取 り 込 みます すると 条 件 をさ まざまに 変 えて iosデバイス 上 で 実 験 的 にレンダリングコードを 実 行 できるようになります たと えば レンダリングが 遅 い 原 因 としてテクスチャの 大 きさが 疑 われる 場 合 アプリケーションがGPU に 送 り 込 んだテクスチャデータと 大 きさを 減 らしたテクスチャデータの 両 方 について 取 り 込 んだ OpenGL ESのコマンド 列 を 実 行 してみるのです 分 析 が 終 わると GPU Report の Problems & Solutions 領 域 には 見 つかった 問 題 と 性 能 向 上 のための 推 奨 事 項 が 表 示 されます 130
131 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり OpenGL ES Frame Debuggerひとめぐり Xcodeはフレームを 取 り 込 むと 自 動 的 に OpenGL ESのデバッグに 適 した 形 に 画 面 を 編 成 し 直 します OpenGL ES Frame Debugger 画 面 は Xcodeのワークスペースウインドウにあるいくつかの 領 域 に 手 を 加 えたもので レンダリング 処 理 に 関 する 情 報 を 表 示 します( 以 下 の 図 B-3と 図 B-4を 参 照 ) な お フレームデバッガはインスペクタペインやライブラリペインを 使 わないので デバッグ 中 はXcode のユーティリティ 領 域 を 非 表 示 にしても 構 いません 図 B-3 フレームデバッガに 描 画 関 数 呼 び 出 しとリソースの 状 況 が 表 示 されている 様 子 131
132 Xcodeに付属するOpenGL ES用ツールの概要 OpenGL ES Frame Debuggerひとめぐり 図 B-4 フレームデバッガにシェーダプログラムの処理性能や分析結果が表示されている様子 ナビゲータ領域 OpenGL ES Frame Debuggerの画面では デバッグナビゲータが OpenGL ESフレームナビゲータに置 き換わります ここには 取り込んだフレームのレンダリングに用いたOpenGL ESのコマンドが 実 行順 あるいは対応するシェーダプログラムごとに列挙されます フレームナビゲータの上部にある Frame View Options ポップアップメニューで 表示形式を切り替えることができます 図 B-5 ナビゲータの View Frame By ポップアップメニュー View Frame By Call 取り込んだフレームを OpenGL ESのコマンド呼び出し順に表示します どのコマンドにエラーがあ るか特定し レンダリングの問題点を診断し 処理性能のボトルネックを特定するために有用です このモードではコマンドを アプリケーションが呼び出した順に並べます エラーの原因になった あるいは処理性能の面で問題が起こりうるコマンドの隣に エラー や 警告 のアイコンが現れ ます 132
133 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり この 一 覧 に 構 造 を 取 り 入 れることもできます glpushgroupmarkerext 関 数 glpopgroupmarkerext 関 数 で OpenGL ESコマンドのグループに 注 釈 を 加 えると そのグループは フォルダ の 形 で 表 示 され 必 要 に 応 じて 展 開 したり 折 りたたんだりできるようになります( 詳 しくは 情 報 提 供 のデバッ グおよびプロファイル 用 に OpenGL ESのコードに 注 釈 を 付 ける (70 ページ)を 参 照 ) さらに OpenGL ESのコマンドを 展 開 して アプリケーションコードのどの 位 置 でコマンドが 発 行 されたか スタックトレースの 形 で 表 示 することも 可 能 です コンテキストメニューで コマンド 名 を 略 称 表 示 するか どのコマンド/グループ/ 警 告 を 表 示 するか の 選 択 が 可 能 です ナビゲータの 下 部 にある 旗 アイコンで OpenGL ESのコマンドをすべて 表 示 するか あるフレームバッファに 描 画 したコマンドのみ 表 示 するか を 切 り 替 えることができます リスト 中 のOpenGL ESコマンドをクリックすると コマンド 並 び 中 の 該 当 する 位 置 に 表 示 が 切 り 替 わ り フレームデバッガの 他 の 領 域 も 表 示 内 容 が 変 わります 接 続 したデバイスの 表 示 は その 位 置 ま でコマンドを 実 行 した 状 態 になります View Frame By Program 取 り 込 んだフレームをプログラム 別 に 表 示 すれば シェーダプログラムや 描 画 コマンドそれぞれが 費 やしたGPU 時 間 を 分 析 できます プログラムが 一 覧 表 示 されている 中 からいずれかを 展 開 すると 当 該 プログラムが 呼 び 出 している シェーダや 描 画 関 数 それぞれが 費 やした 時 間 が 分 かります また 描 画 関 数 の 呼 び 出 しが 一 覧 表 示 さ れている 中 からいずれかを 展 開 すると アプリケーションコードのどこで 発 行 したコマンドか ス タックトレースの 形 で 表 示 されます コンテキストメニューで 消 費 時 間 順 に 並 べ 替 える 総 レンダリング 時 間 に 対 する 比 率 で 時 間 を 表 示 するなど 表 示 方 法 を 変 更 できます プログラムやシェーダをクリックすると 対 応 するGLSLソースコードが 主 エディタに 表 示 されます また OpenGL ESコマンドをクリックすると 取 り 込 んだフレームの 描 画 コマンド 列 中 該 当 する 箇 所 に 移 動 できます 注 意 : View Frame By Program に 切 り 替 え 可 能 なのは OpenGL ES 3.0に 対 応 したデバイス 上 でデバッグしているときに 限 ります(アプリケーションがOpenGL ES 3.0または2.0の ど ちらのコンテキストを 使 っていても 可 ) そうでないデバイスの 場 合 Frame View Options ポップアップメニューは 開 けません エディタ 領 域 フレームを 取 り 込 んでデバッグする 際 には レンダリング 対 象 のフレームバッファを 主 エディタにプ レビュー 表 示 し アシスタントエディタ 側 で OpenGL ESリソースの 状 況 を 調 べ GLSLシェーダプロ グラムを 編 集 することになります アシスタントエディタは 通 常 OpenGL ESコンテキストが 現 在 管 133
134 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり 理 しているリソースをすべて グラフィック 表 示 するようになっています( 図 B-3 (131 ページ)を 参 照 ) アシスタントエディタのジャンプバーで フレームナビゲータで 選 択 したコマンド 呼 び 出 し に 対 応 するリソースのみ 表 示 するよう 切 り 替 え あるいは 特 定 のリソースを 選 択 してさらに 詳 しく 調 べることができます さらに 概 要 画 面 に 現 れているリソースをダブルクリックし 内 容 を 詳 しく 調 べることも 可 能 です リソースを 選 択 すると アシスタントエディタの 表 示 が その 種 類 に 応 じた 形 式 に 変 わります フレームバッファの 内 容 をプレビュー 表 示 する 主 エディタには フレームバッファの 内 容 が フレームナビゲータで 選 択 している 描 画 コマンドを 実 行 した 状 態 で 表 示 されます(フレームナビゲータで 選 択 したOpenGL ESコマンドが 状 態 を 設 定 する gluseprogramなど 描 画 コマンド 以 外 のものであった 場 合 直 近 の 描 画 コマンドを 実 行 した 状 態 に なります) また 主 エディタの 上 部 にあるジャンプバーで OpenGL ESコマンド 列 の 中 を 自 由 にナ ビゲートできます 図 B-6 フレームバッファ 情 報 ポップオーバー エディタには 描 画 処 理 にバインドされている 各 フレームバッファアタッチメントの 内 容 がプレビュー 表 示 されます たとえば3Dレンダリングでは 多 くの 場 合 フレームバッファとともに 色 および 深 度 のアタッチメントを 使 います( 図 を 参 照 ) エディタの 左 下 にあるコントロール 部 品 で 表 示 する フレームバッファアタッチメントを 切 り 替 えることができます フレームバッファアタッチメント 名 の 左 側 にある 情 報 ボタンを 押 すと そのプロパティを 表 示 するポップオーバーが 現 れます( 図 134
135 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり B-6を 参 照 ) また 右 側 にある 設 定 ボタンを 押 すと 現 れるポップオーバーで プレビュー 画 像 の 表 示 を 制 御 できます たとえば 深 度 バッファのZ 値 がある 範 囲 内 の 部 分 をグレースケールでプレ ビュー 表 示 する といったことが 可 能 です( 図 B-7を 参 照 ) 図 B-7 フレームバッファ 設 定 ポップオーバー 各 フレームバッファアタッチメントのプレビューでは 現 在 実 行 している 描 画 コマンドの 効 果 を 緑 のワイヤーフレームで 強 調 して 示 すことも 可 能 です( 図 B-3 (131 ページ)を 参 照 ) プレビュー 画 像 のコンテキストメニューで 強 調 部 分 をプレビューに 表 示 するか 接 続 したデバイスに 表 示 する か 切 り 替 えることができます シェーダプログラムを 編 集 する アシスタントエディタのジャンプバーやリソース 概 要 画 面 で シェーダプログラムを 選 択 すると 当 該 プログラムのフラグメントシェーダのGLSLソースコードが 表 示 されます( 図 B-8を 参 照 ) フレー ムナビゲータでプログラムを 選 択 すると( View Frame By Program (133 ページ)を 参 照 ) 主 エディ 135
136 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり タにはプログラムのフラグメントシェーダ アシスタントエディタには 頂 点 シェーダが 現 れます フ ラグメントシェーダを 表 示 するエディタはいずれも ジャンプバーを 使 って 対 応 する 頂 点 シェーダ の 表 示 と 相 互 に 切 り 替 えることができます 図 B-8 GLSLシェーダのソースエディタと 更 新 ボタン シェーダのソースコードの 各 行 には レンダリング 時 間 に 占 める 割 合 に 応 じて 右 余 白 に 棒 が 表 示 さ れます どの 部 分 に 最 適 化 を 施 せば 効 果 があるか これで 見 極 めることができます ある 特 定 の 数 行 が 大 部 分 の 時 間 を 占 めているようであれば そこを 高 速 化 する 手 立 てを 考 えてください(シェーダの 性 能 向 上 に 関 するヒントが シェーダのベストプラクティス (103 ページ)に 載 っています) エディタ 上 でシェーダのソースコードに 変 更 を 施 すことができます その 後 エディタ 下 部 の Update ボタンを 押 すと( 図 B-8 (136 ページ)を 参 照 ) プログラムが 再 コンパイルされ 取 り 込 んだフレームでその 効 果 を 確 認 できます GLSLコンパイラがエラーや 警 告 のメッセージを 出 した 場 合 Xcodeは 該 当 するソースコードに 注 釈 を 施 します 再 コンパイルしたシェーダプログラムはデバ イス 上 にそのまま 残 るので アプリケーションの 実 行 を 再 開 できます デバッグバーの Continue ボタンを 押 すと 動 作 している 状 態 でシェーダの 変 化 が 確 認 可 能 です 136
137 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり 頂 点 データを 調 査 する 配 列 バッファの 内 容 を 調 査 するためには アシスタントエディタを 使 うのが 便 利 でしょう( 図 B-9を 参 照 ) OpenGL ESのメモリ 上 のバッファには 形 式 が 定 義 されていないので エディタ 下 部 のポップ アップメニューで 表 示 方 法 (32ビット 整 数 や 浮 動 小 数 点 数 をそのまま 表 示 する 16ビット 整 数 や 半 精 度 浮 動 小 数 点 数 が2つ 並 んだものとして 表 示 する など)や データを 列 に 並 べる 数 を 選 択 できま す 図 B-9 アシスタントエディタに 配 列 バッファの 内 容 を 表 示 している 様 子 頂 点 配 列 オブジェクト(VAO Vertex Array Object)には OpenGL ESのメモリ 上 にあるデータバッファ と そこからシェーダプログラムに 頂 点 データを 供 給 するための 属 性 バインディングがカプセル 化 さ れています(VAOの 使 い 方 について 詳 しくは 頂 点 配 列 オブジェクトの 使 用 による 頂 点 配 列 状 態 の 変 化 の 整 理 統 合 (92 ページ)を 参 照 ) VAOバインディングにはバッファ 内 容 の 形 式 に 関 する 情 報 があ るので VAOを 調 べることにより OpenGL ESがその 内 容 をどのように 解 釈 したかが 分 かります( 図 B-10を 参 照 ) 図 B-10 アシスタントエディタに 頂 点 配 列 オブジェクトがプレビュー 表 示 されている 様 子 137
138 Xcodeに付属するOpenGL ES用ツールの概要 OpenGL ES Frame Debuggerひとめぐり テクスチャやレンダバッファを表示する テクスチャやレンダバッファを調べるためには アシスタントエディタで その内容の画像プレビュー を表示するとよいでしょう 主エディタと同じコントロール部品を使って テクスチャオブジェクト やレンダバッファに関する詳細を調べ 画像プレビューを補正できます テクスチャについては ア シスタントエディタの左下隅にコントロール部品が追加され 各ミップマップレベルと もしあれ ば キューブマップテクスチャの各面をプレビュー表示できます 図 B-11を参照 図 B-11 アシスタントエディタにキューブマップテクスチャをプレビュー表示している様子 138
139 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり デバッグ 領 域 デバッグバーには 取 り 込 んだOpenGL ESのコマンド 列 をナビゲートするためのコントロール 部 品 が いくつかあります( 図 B-12を 参 照 ) これを 使 って フレームナビゲータに 表 示 されている 階 層 に 沿 ってコマンドを 選 択 し あるいは 矢 印 やスライダでコマンド 列 を 前 後 に 行 き 来 することができま す Continue ボタンを 押 すとフレームのデバッグが 終 了 し アプリケーションの 実 行 に 戻 りま す 図 B-12 OpenGL ESのデバッグバー フレームデバッガにはデバッグコンソールがありません 代 わりにXcodeには 変 数 ビューがいくつか あり OpenGL ESにおけるレンダリング 処 理 の 状 態 について それぞれ 異 なる 視 点 から 概 要 を 表 示 す るようになっています 変 数 ビューはポップアップメニューで 切 り 替 え 可 能 です 個 々の 変 数 ビュー について 以 下 に 解 説 します All GL Objects ビュー All GL Objects ビューは Bound GL Objects ビュー( 図 B-13 (140 ページ)の 右 側 )と 同 様 に アシスタントエディタに 示 したグラフィカル 概 要 と 同 じ OpenGL ESのリソースを 列 挙 します しか しグラフィック 概 要 と 違 って 三 角 形 アイコンをクリックすることにより 展 開 表 示 に 切 り 替 えると リソースに 関 するより 詳 しい 情 報 が 得 られます たとえばフレームバッファやバッファオブジェクト のリストを 展 開 表 示 すると glgetbufferparameterやglgetframebufferattachmentparameterな ど OpenGL ESの 問 い 合 わせ 関 数 を 使 ってしか 調 べられない 情 報 も 得 られます シェーダプログラム のリストを 展 開 表 示 にすると 状 態 属 性 バインディング ユニフォーム 変 数 それぞれにバインドさ れている 値 が 分 かります 139
140 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり Bound GL Objects ビュー Bound GL Objects ビュー( 図 B-13の 右 側 )は All GL Objects ビューとほぼ 同 じ 動 作 ですが フ レームナビゲータで 選 択 したOpenGL ESコマンドで 使 われているリソースのみを 一 覧 表 示 します 図 B-13 デバッグ 領 域 に GL Context ビューと Bound GL Objects ビューが 表 示 されている 様 子 GL Context ビュー GL Context ビュー( 図 B-13の 左 側 )には OpenGL ESレンダラの 状 態 ベクトルがすべて 機 能 グ ループごとに 整 理 して 表 示 されます フレームナビゲータで OpenGL ESの 状 態 を 変 更 する 関 数 呼 び 出 しを 選 択 すると 変 更 後 の 値 が 強 調 表 示 されます たとえばglCullFace 関 数 やglFrontFace 関 数 を 呼 び 出 すと 状 態 が 列 挙 されているうち Culling セクションの 値 が 変 わり 強 調 表 示 になりま す 同 様 に glenable(gl_blend) 関 数 でブレンディングを 有 効 にし あるいはglBlendFunc 関 数 で そのパラメータを 変 更 すると Blending セクションの 値 が 変 わり 強 調 表 示 になります 140
141 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり Context Info ビュー Context Info ビュー( 図 B-14の 右 側 )には 使 用 中 のOpenGL ESレンダラに 関 する 静 的 な 情 報 す なわち 名 前 版 能 力 拡 張 機 能 などのデータが 表 示 されます レンダラ 属 性 (GL_MAX_TEXTURE_IMAGE_UNITS GL_EXTENSIONSなど)を 問 い 合 わせるコードを 記 述 しなくても 必 要 なデータを 得 ることができます 図 B-14 デバッグ 領 域 に Auto ビューと Context Info ビューが 現 れている 様 子 Auto ビュー Auto ビュー( 図 B-14の 左 側 )には 他 の 変 数 ビューに 通 常 表 示 される 項 目 や フレームナビゲー タで 選 択 した 関 数 呼 び 出 しに 関 係 する 他 の 情 報 の 一 部 が 自 動 的 に 表 示 されます たとえば 次 のよう な 内 容 です 選 択 した 関 数 を 実 行 した 結 果 OpenGL ESのエラーが 生 じた あるいは 性 能 上 の 問 題 点 をXcodeが 特 定 した 場 合 エラー/ 警 告 とその 修 正 方 法 が 表 示 されます 選 択 した 関 数 が OpenGL ESのコンテキスト 状 態 の 一 部 を 変 更 し あるいはその 動 作 がコンテキ スト 状 態 に 依 存 する 場 合 GL Context ビューから 自 動 的 に 関 連 情 報 を 選 んで 表 示 するように なっています 選 択 した 関 数 がリソースをバインドし あるいはバインドしたリソース( 頂 点 配 列 オブジェク ト プログラム テクスチャなど)を 使 っている 場 合 BoundGLObjects ビューから 自 動 的 に 関 連 情 報 を 選 んで 表 示 するようになっています 描 画 関 数 を 選 択 すると プログラムの 処 理 性 能 に 関 する 情 報 ( 描 画 中 に 各 シェーダが 費 やした 総 時 間 を 含 む)が 表 示 されます また フレームを 取 り 込 んだ 後 にシェーダを 変 更 再 コンパイル した 場 合 は 各 シェーダについて 変 更 前 の 基 準 時 間 との 差 も 表 示 されます(プログラムの 処 理 性 能 に 関 する 情 報 が 得 られるのは OpenGL ES 3.0 対 応 デバイスでデバッグしている 場 合 に 限 りま す) 141
142 Xcodeに 付 属 するOpenGL ES 用 ツールの 概 要 OpenGL ES Frame Debuggerひとめぐり このビューにはさらに フレームのレンダリング 性 能 に 関 する 累 積 統 計 情 報 ( 描 画 関 数 の 呼 び 出 し 数 フレームレートなど)も 表 示 されます 142
143 texturetoolを 使 用 したテクスチャの 圧 縮 ios SDKには テクスチャをPVRTCまたはASTCフォーマットに 圧 縮 するtexturetoolという 名 前 のツー ルが 含 まれています ios 7.0 SDKと 一 緒 にXcodeをインストールした 場 合 texturetoolは 次 の 場 所 にありま す /Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool texturetoolには 画 像 の 品 質 とサイズの 間 のトレードオフに 対 応 するさまざまな 圧 縮 オプションが あります どの 設 定 が 最 適 な 妥 協 点 かを 判 断 するには テクスチャごとに 実 験 する 必 要 があります 注 意 : texturetoolで 利 用 可 能 なエンコーダ フォーマット およびオプションは 変 更 され る 可 能 性 があります この 文 書 では ios 7 現 在 で 利 用 可 能 なオプションについて 説 明 しま す texturetoolのパラメータ この 節 では texturetoolに 渡 すことができるパラメータについて 説 明 します user$ texturetool -h Usage: texturetool [-hl] texturetool -c <reference_image> <input_image> texturetool [-ms] [-e <encoder>] [-p <preview_file>] -o <output> [-f <format>] <input_image> first form: -h Display this help menu. -l List available encoders, individual encoder options, and file formats. second form: -c Compare <input_image> to <reference_image> and report differences. third form: 143
144 texturetoolを 使 用 したテクスチャの 圧 縮 texturetoolのパラメータ -m Generate a complete mipmap chain from the input image. -s Report numerical differences between <input_image> and the encoded image. -e <encoder> Encode texture levels with <encoder>. -p <preview_file> Output a PNG preview of the encoded output to <preview_file>. Requires -e option -o <output> Write processed image to <output>. -f <format> Set file <format> for <output> image. 注 意 : -pオプションを 指 定 する 場 合 は-e オプションも 指 定 する 必 要 があります また -o オプションも 必 要 です リスト C-1 エンコードオプション user$ texturetool -l Encoders: PVRTC --channel-weighting-linear --channel-weighting-perceptual --bits-per-pixel-2 --bits-per-pixel-4 --alpha-is-independent --alpha-is-opacity --punchthrough-unused --punchthrough-allowed --punchthrough-forced ASTC --block-width-4 --block-width-5 --block-width-6 --block-width-8 --block-width-10 --block-width-12 --compression-mode-veryfast 144
145 texturetoolを 使 用 したテクスチャの 圧 縮 texturetoolのパラメータ --compression-mode-fast --compression-mode-medium --compression-mode-thorough --compression-mode-exhaustive --srgb-yes --srgb-no --block-height-4 --block-height-5 --block-height-6 --block-height-8 --block-height-10 --block-height-12 Formats: Raw PVR KTX 何 もオプションが 指 定 されない 場 合 texturetoolはデフォルトの--bits-per-pixel-4 --channel-weighting-linear および-f Rawで 実 行 されます --bits-per-pixel-2オプションと--bits-per-pixel-4オプションは 元 のピクセルを2ビット/ピ クセルまたは4ビット/ピクセルにエンコードするPVRTCデータを 作 成 します これらのオプションは 圧 縮 なしの32ビットRGBA 画 像 データと 比 べて それぞれ16:1と8:1の 圧 縮 率 になります 32バイトが 最 小 データサイズです 圧 縮 処 理 によってこれより 小 さいファイルは 作 成 されません したがって 圧 縮 されたテクスチャデータをアップロードするときは 少 なくともこのバイト 数 はアップロードされ ます --channel-weighting-linearを 指 定 して 圧 縮 した 場 合 は すべてのチャンネルに 均 等 に 圧 縮 誤 差 が 拡 散 されます 対 照 的 に --channel-weighting-perceptualを 指 定 すると リニアオプションの 場 合 と 比 べて 緑 チャネルの 誤 差 を 減 らすことができます 一 般 に PVRTC 圧 縮 は 線 画 よりも 写 真 画 像 に 効 果 的 です -mオプションを 利 用 すると 元 の 画 像 に 対 するミップマップレベルが 自 動 的 に 生 成 されます これらの レベルは 作 成 されるアーカイブ 内 に 追 加 画 像 データとして 提 供 されます Raw 画 像 フォーマットを 使 用 した 場 合 は 各 レベルの 画 像 データがアーカイブの 最 後 に 順 番 に 追 加 されます PVRアーカイブ フォーマットを 使 用 した 場 合 は 各 ミップマップは 独 立 した 画 像 としてアーカイブに 提 供 されます 145
146 texturetoolを 使 用 したテクスチャの 圧 縮 texturetoolのパラメータ (-f)パラメータは その 出 力 ファイルの 形 式 を 制 御 します デフォルトのフォーマットはRawで す このフォーマットは1つのテクスチャレベル(-mオプションなし) または 各 テクスチャレベル を 連 結 した(-mオプションあり) 未 加 工 の 圧 縮 テクスチャデータです ファイルに 格 納 された 各 テク スチャレベルのサイズは 少 なくとも32バイトあり これがそのままGPUにアップロードされなければ なりません PVRフォーマットは Imagination TechnologiesのPowerVR SDKに 含 まれているPVRTexTool で 使 われるフォーマットと 同 じです PVR 圧 縮 テキスチャを 読 み 込 むには GLKTextureLoaderクラ スを 使 います -sおよび-cオプションは エンコード 中 にエラーメトリックを 印 刷 します -sオプションは 入 力 ( 圧 縮 なし) 画 像 を 出 力 (エンコード 済 み) 画 像 と 比 較 し -cオプションは 任 意 の2つの 画 像 を 比 較 しま す 比 較 結 果 として 二 乗 平 均 平 方 根 エラー(rms) 聴 覚 特 性 を 考 慮 したpRms 最 悪 の 場 合 のテク セルエラー(max) および 各 統 計 の 合 成 ベースバージョン(rmsC prmsc およびmaxC)がありま す 合 成 ベースエラーは 画 像 のアルファチャネルが 不 透 明 度 に 使 用 され 各 テクセルの 色 が 最 悪 の 場 合 のレンダリング 先 の 色 と 混 合 されるようにします -sおよび-cおよびオプション ならびに 圧 縮 画 像 を 処 理 するときにエンコーダによって 使 用 されるエ ラーメトリックは 画 像 のアルファチャネルをデフォルトでは(または--alpha-is-independentオ プションの 使 用 時 には) 独 立 したチャネルとして 扱 います --alpha-is-opacityオプションは エ ラーメトリックを glblendfunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA )を 呼 び 出 すことに よって 実 装 される 標 準 混 合 操 作 に 基 づいたメトリックに 変 更 します PVRテクスチャ 圧 縮 では 4x4ブロック 単 位 で 有 効 にできる 特 別 なパンチスルーモードがサポートさ れています このモードでは ブロック 内 で 使 用 できる 色 のグラデーションが 制 限 されますが ピク セルのアルファ 値 を0に 強 制 するオプションが 導 入 されています これは PVRTCの 滑 らかな 色 の 補 間 を 無 効 にし ブロック 境 界 のアーティファクトを 生 じさせるため 注 意 して 使 用 する 必 要 がありま す パンチスルーオプションは 次 の3つです --punchthrough-unused パンチスルーなし(デフォルトのオプション) --punchthrough-allowed エンコーダは 画 質 を 最 適 化 するときに ブロック 単 位 でパンチ スルーを 有 効 にできます このオプションは 圧 縮 アルゴリズムによって 使 用 される 客 観 的 な(1 ピクセルあたり)のエラーメトリックを 一 般 に 向 上 させますが 主 観 的 なアーティファクトを 生 じさせる 可 能 性 があります --punchthrough-forced パンチスルーはすべてのブロックで 有 効 になり 色 のグラデーショ ンを 制 限 しますが ブロック 内 の 任 意 のピクセルのアルファが0になるようにすることができま す このオプションは 主 に 完 全 性 のために 提 供 されますが 結 果 を 他 のオプションと 視 覚 的 に 比 較 できるときにも 役 立 つ 場 合 があります 146
147 texturetoolを 使 用 したテクスチャの 圧 縮 texturetoolのパラメータ Important: エンコーダ 用 のソース 画 像 は 次 の 要 件 を 満 たしている 必 要 があります 高 さと 幅 が 少 なくとも8はある 高 さと 幅 が2のべき 乗 である 正 方 形 である( 高 さ== 幅 ) ソース 画 像 は OS X 上 でImage IOが 受 理 するフォーマットである 最 良 の 結 果 を 得 るには 元 のテクスチャは 圧 縮 なしのデータフォーマットであるべきです Important: PVRTexToolを 使 用 してテクスチャを 圧 縮 している 場 合 は 2のべき 乗 の 長 さを 持 つ 正 方 形 のテクスチャを 作 成 しなければなりません アプリケーションが 正 方 形 以 外 のテクスチャや2の べき 乗 以 外 のテクスチャをiOSにロードしようとすると エラーが 返 されます リスト C-2 画 像 をPVRTC 圧 縮 フォーマットにエンコードする Encode Image.png into PVRTC using linear weights and 4 bpp, and saving as ImageL4.pvrtc user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc Image.png Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving as ImageP4.pvrtc user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc Image.png Encode Image.png into PVRTC using linear weights and 2 bpp, and saving as ImageL2.pvrtc user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc Image.png Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving as ImageP2.pvrtc user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2 -o ImageP2.pvrtc Image.png リスト C-3 プレビューを 作 成 するとともに 画 像 をPVRTC 圧 縮 フォーマットにエンコードする Encode Image.png into PVRTC using linear weights and 4 bpp, and saving the output as ImageL4.pvrtc and a PNG preview as ImageL4.png user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc -p ImageL4.png Image.png Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving the output as ImageP4.pvrtc and a PNG preview as ImageP4.png user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc -p ImageP4.png Image.png 147
148 texturetoolを 使 用 したテクスチャの 圧 縮 texturetoolのパラメータ Encode Image.png into PVRTC using linear weights and 2 bpp, and saving the output as ImageL2.pvrtc and a PNG preview as ImageL2.png user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc -p ImageL2.png Image.png Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving the output as ImageP2.pvrtc and a PNG preview as ImageP2.png user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2 -o ImageP2.pvrtc -p ImageP2.png Image.png 注 意 : -oパラメータと 有 効 な 出 力 ファイルを 指 定 しないと プレビューは 作 成 できません プレビュー 画 像 は 常 にPNG 形 式 になります PVR 圧 縮 テキスチャを 読 み 込 むには GLKTextureLoaderクラスを 使 います PVR 圧 縮 したデータを 直 接 処 理 する 例 が PVRTextureLoader に 載 っています 148
149 書 類 の 改 訂 履 歴 この 表 は ios 用 OpenGL ESプログラミングガイド の 改 訂 履 歴 です 日 付 メモ ASTCテクスチャおよびKTXフォーマットを 参 照 するようにtexturetool リストを 更 新 しました レンダリングの 手 順 やメモリ 管 理 に 関 する 説 明 を 改 訂 しました OpenGL ES 3.0およびその 重 要 な 拡 張 機 能 ios 7.1で 新 たに 組 み 込 ま れたマルチスレッド 機 能 XcodeのOpenGL ES 用 ツール 群 GPUの アーキテクチャや 性 能 に 関 する 問 題 について 解 説 を 追 加 あるいは 補 足 しました OpenGL ES 3.0 GLKit およびXcodeデバッガに 関 する 詳 細 情 報 を 含 めるために 更 新 しました プラットフォームによる 違 い を OpenGL ES Hardware Platform Guide for ios に 移 動 しました プラットフォームによる 違 い の 章 を 削 除 し その 情 報 をそれ 自 体 のマニュアル OpenGL ES Hardware Platform Guide for ios に 移 動 しました Xcode 4で 提 供 された 新 しいOpenGL ESツールについての 情 報 を 追 加 しました コンテンツ 共 有 はすべてのコンテンツが 同 じバージョン のOpenGL ES APIを 共 有 する 場 合 にのみ 使 用 できることを 明 記 しまし た 文 書 内 のすべての 情 報 を 大 幅 に 改 訂 拡 充 しました 149
150 書 類 の 改 訂 履 歴 日 付 メモ よく 使 用 されるグラフィックス 関 連 およびOpenGL ES 関 連 用 語 の 解 説 を 追 加 しました ios 4で 追 加 された 機 能 強 化 (レンダバッファの 破 棄 )も 含 め レン ダリングループの 詳 細 な 説 明 を 追 加 しました リンクを 訂 正 しました パフォーマンスに 関 するいくつかのガイド ラインを 明 確 にしました ios 4で 追 加 された 新 しい 拡 張 機 能 へのリ ンクを 追 加 しました iphone OS OpenGL ESプログラミングガイド から 文 書 名 を 変 更 し ました ios 4で 公 開 された 新 しい 拡 張 機 能 を 追 加 しました 画 面 への 描 画 を 行 うフレームバッファオブジェクトを 作 成 するため のコードを 修 正 しました 細 かな 改 訂 と 編 集 を 行 いました わかりやすくするために 表 現 を 編 集 しました 拡 張 機 能 リストを 現 在 利 用 可 能 な 機 能 を 反 映 するように 更 新 しました 頂 点 処 理 能 力 を 最 高 にする 三 角 形 ストリップの 使 いかたを 明 確 にしました プ ラットフォームの 章 に PowerVR SGX 上 でのテクスチャの 処 理 能 力 に 関 する 注 を 追 記 しました iphoneアプリケーション 内 に 高 いパフォーマンスのグラフィックス を 作 成 するためにOpenGL ES 1.1および2.0のプログラミングインター フェイスを 使 用 する 方 法 について 説 明 した 文 書 の 初 版 150
151 用 語 解 説 この 用 語 解 説 では AppleによるOpenGL ESの 実 装 で 特 に 使 用 されている 用 語 と OpenGL ESグ ラフィックスプログラミングにおける 一 般 的 な 用 語 を 取 り 上 げています エイリアス 化 (aliased) グラフィックスのエッ ジがギザギザになっている 様 子 を 指 す アンチ エイリアス 化 の 操 作 によって 改 善 可 能 アンチエイリアス 化 (antialiasing) グラフィッ クスにおいて テキストや 線 画 画 像 などのグ ラフィカルオブジェクトを 描 画 したときに 現 れ ることのある ギザギザになった(エイリアス 化 した)エッジを 滑 らかにしたり ぼやかした りするテクニック アタッチ(attach) 2つの 既 存 のオブジェクト を 結 び 付 けること バインド(bind)も 参 照 の こと バインド(bind) 新 しいオブジェクトを 作 成 し そのオブジェクトとレンダリングコンテキ ストを 結 び 付 けること アタッチ(attach)も 参 照 のこと ビットマップ(bitmap) ビットで 構 成 された 矩 形 状 の 配 列 バッファ(buffer) 頂 点 属 性 や 色 データ イン デックスなど 特 定 の 種 類 のデータを 格 納 する ためだけに 確 保 されたメモリのブロック OpenGL ESが 管 理 クリッピング(clipping) 描 画 する 領 域 を 特 定 する 操 作 クリッピング 領 域 にないものは 描 画 されません クリップ 座 標 (clip coordinates) ビューボ リュームのクリッピングに 使 用 される 座 標 系 クリップ 座 標 は 投 影 行 列 を 適 用 した 後 透 視 除 算 よりも 前 に 適 用 されます 完 全 性 (completeness) フレームバッファオ ブジェクトが 描 画 のためのすべての 要 件 を 満 た しているかどうかを 表 している 状 態 コンテキスト(context) 一 連 のOpenGL ES 状 態 変 数 コンテキストにアタッチされている 描 画 可 能 なオブジェクトに 対 して どのように 描 画 を 行 うかに 影 響 します レンダリングコンテ キスト とも 呼 びます 間 引 き(culling) オブザーバが 見 ることので きない シーンの 一 部 分 を 取 り 除 くこと 現 在 のコンテキスト(current context) アプリ ケーションが 発 行 したコマンドをOpenGL ESが 送 る 先 のレンダリングコンテキスト 現 在 の 行 列 (current matrix) ある 座 標 系 から 別 の 座 標 系 へと 座 標 を 変 換 するためにOpenGL ES が 使 用 する 行 列 モデルビュー 行 列 透 視 行 列 テクスチャ 行 列 などがあります GLSL ESで は 代 わりにユーザ 定 義 の 行 列 が 使 用 されま す 深 度 (depth) OpenGLにおいて z 座 標 のこと を 指 し オブザーバからピクセルがどれくらい 離 れているかを 指 定 深 度 バッファ(depth buffer) 各 ピクセルの 深 度 値 を 格 納 するため 使 用 する メモリのブロッ ク 深 度 バッファは オブザーバからピクセル が 見 えるかどうかを 決 めるために 使 用 します OpenGL ESがラスタ 化 したフラグメントはすべ 151
152 用 語 解 説 て 深 度 バッファに 格 納 されている 値 と 受 信 し た 深 度 値 とを 比 較 する 深 度 テストを 通 過 しなけ ればなりません ダブルバッファリング(double buffering) 2 つのバッファを 使 用 して グラフィックサブシ ステムの 異 なる2つの 部 分 の 間 でリソースが 競 合 するのを 避 けること フロントバッファを 一 方 の 当 事 者 が 使 用 している 間 に もう 一 方 の 当 事 者 がバックバッファを 修 正 します スワップ が 発 生 すると 前 面 バッファと 背 面 バッファが 入 れ 替 わります 描 画 可 能 オブジェクト(drawable object) OpenGL ESの 外 部 で 割 り 当 てられたオブジェク ト OpenGL ESフレームバッファオブジェクト の 一 部 として 使 用 できます iosでは この 種 類 の 描 画 可 能 オブジェクトのみが OpenGL ESレ ンダリングをCore Animationに 統 合 する CAEAGLLayerクラスです 拡 張 機 能 (extension) OpenGL ESのコアAPIの 一 部 ではなく そのためOpenGL ESのすべての 実 装 でのサポートが 保 証 されていない OpenGL ESの 機 能 拡 張 機 能 に 使 用 される 命 名 規 則 は その 拡 張 機 能 がどれくらい 幅 広 く 受 け 入 れられているかを 示 しています 特 定 の 会 社 だけがサポートする 拡 張 機 能 の 名 前 には 会 社 名 の 省 略 形 が 含 まれます 複 数 の 会 社 が 拡 張 機 能 を 採 用 している 場 合 その 拡 張 機 能 の 名 前 は 会 社 名 の 省 略 形 の 代 わりにEXTが 含 まれるよう 変 更 されます Khronos OpenGL Working Group が 拡 張 機 能 を 承 認 している 場 合 拡 張 機 能 の 名 前 は EXTまたは 会 社 名 の 省 略 形 の 代 わりに OESが 含 まれるよう 変 更 されます 眼 点 座 標 (eye coordinates) 原 点 のオブザー バが 使 用 する 座 標 系 眼 点 座 標 はモデルビュー 行 列 によって 生 成 され 投 影 行 列 に 渡 されま す フィルタ(filtering) ピクセルまたはテクセル を 組 み 合 わせることで 画 像 を 修 正 するプロセ ス フォグ(fog) オブザーバからの 距 離 に 基 づ き 背 景 色 へと 色 をフェードすることによって 達 成 される 効 果 フォグは オブザーバに 深 度 の 手 がかりを 与 えます フラグメント(fragment) プリミティブをラ スタ 化 するときに 計 算 された 色 と 深 度 の 値 各 フラグメントは フレームバッファに 格 納 され ているピクセルとブレンドする 前 に 一 連 のテス トを 通 過 しなければなりません システムフレームバッファ(system framebuffer) オペレーティングシステムによっ て 提 供 されるフレームバッファ この 種 類 のフ レームバッファでは オペレーティングシステ ムのウインドウシステムへのOpenGL ESの 統 合 がサポートされています iosではシステムフ レームバッファは 使 用 されません 代 わりに Core Animationレイヤと 関 連 付 けられたフレーム バッファオブジェクトがあります フレームバッファにアタッチ 可 能 な 画 像 (framebuffer attachable image) フレームバッ ファオブジェクトのレンダリング 先 フレームバッファオブジェクト(framebuffer object) OpenGL ESによって 全 体 が 管 理 される フレームバッファ フレームバッファオブジェ クト(framebuffer object)は OpenGL ESのフ レームバッファに 関 する 状 態 情 報 およびレン ダバッファ と 呼 ばれる 画 像 のセットを 格 納 しま す OpenGL ES 2.0 以 降 に 構 築 されるフレーム バッファオブジェクト およびiOSにおける OpenGL ES 1.1 実 装 のすべてが ( 拡 張 機 能 OES_framebuffer_objectを 通 じて)フレーム バッファオブジェクトをサポートします フラスタム(frustum) オブザーバから 見 え る 透 視 除 算 によって 歪 んだ 空 間 領 域 152
153 用 語 解 説 画 像 (image) ピクセルで 構 成 された 矩 形 状 の 配 列 インターリーブされたデータ(interleaved data) 頂 点 データやテクスチャ 座 標 など 異 なるデータで 構 成 され グループとしてまとめ られた 配 列 インターリーブにより データの 取 得 を 高 速 化 できます ミップマップ(mipmaps) さまざまな 解 像 度 で 提 供 される テクスチャマップのセット オ ンスクリーンの 解 像 度 がソースのテクスチャ マップに 適 合 していないジオメトリのプリミ ティブに 対 して テクスチャが 適 用 されるとき に 発 生 する 可 能 性 のあるアーティファクトを 最 小 限 に 抑 えることが 目 的 です ミップマップと はラテン 語 のmultuminparvo に 由 来 する 言 葉 で 狭 い 場 所 に 多 くのものがある ことを 意 味 し ます モデルビュー 行 列 (modelview matrix) 点 線 多 角 形 の 変 換 およびオブジェクトの 座 標 から 眼 点 座 標 への 位 置 の 変 換 のためにOpenGLが 使 用 する 4 4の 行 列 マルチサンプル 機 能 (multisampling) ピクセ ルを 対 象 に 複 数 のサンプルを 取 得 し サンプル をカバレッジ 値 と 組 み 合 わせて 最 終 フラグメン トに 到 達 するためのテクニック ミューテックス(mutex) マルチスレッドア プリケーションにおける 相 互 排 他 オブジェク ト パッキング(packing) ピクセルの 色 コンポー ネントを バッファからアプリケーションが 要 求 するフォーマットに 変 換 すること ピクセル(pixel) ピクチャの 要 素 グラフィッ クスハードウェアが 画 面 上 に 表 示 できる 最 も 小 さい 要 素 です ピクセルは フレームバッファ 内 のすべてのビットプレーンにおける x,y の 位 置 にあるすべてのビットで 構 成 されていま す ピクセル 深 度 (pixel depth) ピクセルの 画 像 における 1ピクセルあたりのビット 数 ピクセルフォーマット(pixel format) ピクセ ルデータをメモリに 格 納 するために 使 用 する フォーマット フォーマットは ピクセルのコ ンポーネント( 赤 緑 青 アルファ) コン ポーネントの 数 と 順 序 およびその 他 の 関 連 情 報 (ピクセルにステンシル 値 や 深 度 値 が 含 まれ るかどうかなど)を 記 述 するものです アルファ 値 乗 算 済 み(premultiplied alpha) ほ かのコンポーネントがすでにアルファ 値 で 乗 じ てあるピクセル たとえば RGBA 値 が(1.0, 0.5, 0.0, 0.5)のピクセルの 場 合 乗 算 済 みの 値 は(0.5, 0.25, 0.0, 0.5)となります プリミティブ(primitives) OpenGLで 最 も 単 純 な 要 素 点 線 多 角 形 ビットマップ 画 像 のこと 投 影 行 列 (projection matrix) 点 線 多 角 形 および 眼 点 座 標 からクリップ 座 標 への 位 置 を 変 換 するためにOpenGLが 使 用 する 行 列 ラスタ 化 (rasterization) 頂 点 データおよびピ クセルデータをフラグメントに 変 換 するプロセ ス 各 フラグメントは フレームバッファ 内 の ピクセルに 対 応 します レンダバッファ(renderbuffer) 2Dピクセル 画 像 のレンダリング 先 OES_framebuffer_object 拡 張 機 能 についてOpenGL 仕 様 で 定 義 されている ように 汎 用 化 されたオフスクリーンレンダリ ングについて 使 用 されます レンダラ(renderer) ビューおよびモデルか ら 画 像 を 作 成 するためにOpenGL ESが 使 用 する ハードウェアとソフトウェアの 組 み 合 わせ 153
154 用 語 解 説 レンダリングコンテキスト(rendering context) 状 態 情 報 のコンテナ レンダリングパイプライン(rendering pipeline) OpenGL ESがピクセルデータと 頂 点 データをフレームバッファの 画 像 に 変 換 するた めに 使 用 する 操 作 の 順 序 render-to-texture テクスチャターゲットに 直 接 コンテンツを 描 画 する 操 作 RGBA 赤 (Red) 緑 (green) 青 (blue) アルファ(alpha)の 色 コンポーネント シェーダ(shader) サーフェスプロパティを 計 算 するプログラム シェーディング 言 語 (shading language) Cに おいてアクセス 可 能 な 高 水 準 言 語 高 度 な 画 像 効 果 を 生 み 出 すために 使 用 します ステンシルバッファ(stencil buffer) ステンシ ルテスト 専 用 のメモリ ステンシルテストは 通 常 マスク 領 域 の 識 別 覆 う 必 要 のある 無 地 の ジオメトリの 識 別 および 半 透 明 の 多 角 形 の オーバーラップに 使 用 します ティアリング(tearing) 現 在 のフレームが 画 面 上 に 完 全 にレンダリングされる 前 に 現 在 の フレームの 一 部 がフレームバッファ 内 の 前 のフ レームのデータを 上 書 きしてしまう 場 合 に 発 生 する 視 覚 的 異 常 iosでは 表 示 可 能 な OpenGL ESコンテンツすべてをCore Animationを 通 じて 処 理 することにより ティアリングを 回 避 します テッセレーション(tessellation) サーフェス を 多 角 形 のメッシュに 変 形 したり 曲 線 を 連 続 する 直 線 に 変 形 したりする 操 作 テクセル(texel) フラグメントに 適 用 する 色 を 指 定 するために 使 用 する テクスチャの 要 素 テクスチャ(texture) ラスタ 化 されたフラグ メントの 色 を 修 正 するために 使 用 する 画 像 デー タ データの 種 類 は 1 次 元 2 次 元 3 次 元 またはキューブマップ テクスチャマッピング(texture mapping) プ リミティブにテクスチャを 適 用 するプロセス テクスチャ 行 列 (texture matrix) テクスチャ 座 標 を 補 間 処 理 やテクスチャ 検 索 に 使 用 する 座 標 に 変 換 するためにOpenGL ES 1.1が 使 用 す る 4 4の 行 列 テクスチャオブジェクト(texture object) テ クスチャに 関 連 するすべてのデータを 格 納 する ために 使 用 する 不 透 明 なデータ 構 造 体 テク スチャオブジェクトには 画 像 やミップマッ プ テクスチャパラメータ( 幅 高 さ 内 部 フォーマット 解 像 度 ラップモードなど)と いったものを 含 めることができます 頂 点 (vertex) 三 次 元 の 先 端 頂 点 のセット は 形 状 のジオメトリを 指 定 します 頂 点 は 色 やテクスチャ 座 標 など 多 数 の 追 加 属 性 を 持 つことができます 詳 細 については 頂 点 配 列 (vertex array)を 参 照 頂 点 配 列 (vertex array) 頂 点 座 標 テクスチャ 座 標 サーフェス 法 線 RGBA 色 色 インデック ス エッジフラグなどを 指 定 する データのブ ロックを 格 納 するデータ 構 造 体 頂 点 配 列 オブジェクト(vertex array object) アクティブな 頂 点 属 性 のリスト 各 属 性 が 格 納 されているフォーマット および 頂 点 と 属 性 を 記 述 するデータの 場 所 を 記 録 するOpenGL ESオ ブジェクト 頂 点 配 列 オブジェクトは グラ フィックスパイプラインを 設 定 し 直 す 手 間 を 軽 減 します 154
155 Apple Inc. Copyright 2015 Apple Inc. All rights reserved. の 法 的 権 利 を 与 え 地 域 によってはその 他 の 権 利 が お 客 様 に 与 えられる 場 合 もあります 本 書 の 一 部 あるいは 全 部 を Apple Inc. から 書 面 による 事 前 の 許 諾 を 得 ることなく 複 写 複 製 (コピー)することを 禁 じます また 製 品 に 付 属 のソフトウェアは 同 梱 のソフトウェア 使 用 許 諾 契 約 書 に 記 載 の 条 件 のもとでお 使 い ください 書 類 を 個 人 で 使 用 する 場 合 に 限 り 1 台 のコンピュータに 保 管 すること またそ の 書 類 にアップルの 著 作 権 表 示 が 含 まれる 限 り 個 人 的 な 利 用 を 目 的 に 書 類 を 複 製 するこ とを 認 めます Apple ロゴは 米 国 その 他 の 国 で 登 録 された Apple Inc. の 商 標 です キーボードから 入 力 可 能 な Apple ロゴについ ても これを Apple Inc. からの 書 面 による 事 前 の 許 諾 なしに 商 業 的 な 目 的 で 使 用 すると 連 邦 および 州 の 商 標 法 および 不 正 競 争 防 止 法 違 反 となる 場 合 があります 本 書 に 記 載 されているテクノロジーに 関 して は 明 示 または 黙 示 を 問 わず 使 用 を 許 諾 し ません 本 書 に 記 載 されているテクノロジー に 関 するすべての 知 的 財 産 権 は Apple Inc. が 保 有 しています 本 書 は Apple ブランド のコンピュータ 用 のアプリケーション 開 発 に 使 用 を 限 定 します 本 書 には 正 確 な 情 報 を 記 載 するように 努 めま した ただし 誤 植 や 制 作 上 の 誤 記 がないこ とを 保 証 するものではありません Apple Inc. 1 Infinite Loop Cupertino, CA U.S.A. Apple Japan 東 京 都 港 区 六 本 木 6 丁 目 10 番 1 号 六 本 木 ヒルズ Offline copy. Trademarks go here. Apple Inc. は 本 書 の 内 容 を 確 認 しておりますが 本 書 に 関 して 明 示 的 であるか 黙 示 的 であるかを 問 わ ず その 品 質 正 確 さ 市 場 性 または 特 定 の 目 的 に 対 する 適 合 性 に 関 して 何 らかの 保 証 または 表 明 を 行 うものではありません その 結 果 本 書 は 現 状 有 姿 のまま 提 供 され 本 書 の 品 質 または 正 確 さに 関 連 して 発 生 するすべての 損 害 は 購 入 者 であるお 客 様 が 負 うものとします いかなる 場 合 も Apple Inc. は 本 書 の 内 容 に 含 ま れる 瑕 疵 または 不 正 確 さによって 生 じる 直 接 的 間 接 的 特 殊 的 偶 発 的 または 結 果 的 損 害 に 対 する 賠 償 請 求 には 一 切 応 じません そのような 損 害 の 可 能 性 があらかじめ 指 摘 されている 場 合 においても 同 様 です 上 記 の 損 害 に 対 する 保 証 および 救 済 は 口 頭 や 書 面 によるか または 明 示 的 や 黙 示 的 であるかを 問 わ ず 唯 一 のものであり その 他 一 切 の 保 証 にかわる ものです Apple Inc. の 販 売 店 代 理 店 または 従 業 員 には この 保 証 に 関 する 規 定 に 何 らかの 変 更 拡 張 または 追 加 を 加 える 権 限 は 与 えられていませ ん 一 部 の 国 や 地 域 では 黙 示 あるいは 偶 発 的 または 結 果 的 損 害 に 対 する 賠 償 の 免 責 または 制 限 が 認 められ ていないため 上 記 の 制 限 や 免 責 がお 客 様 に 適 用 さ れない 場 合 があります この 保 証 はお 客 様 に 特 定
KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2
目 次 動 作 環 境 特 長 方 法 方 法 起 動 終 了 方 法 方 法 操 作 方 法 使 方 使 方 使 方 詳 細 設 定 使 方 KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2 KINGSOFT Office 2016 特 長 主 特 長 以
・モニター広告運営事業仕様書
秋 田 市 新 庁 舎 動 画 広 告 放 映 事 業 仕 様 書 1 目 的 多 く の 市 民 の 目 に 触 れ る 市 役 所 の 特 性 を 活 か し 映 像 や 音 声 を 活 用 し た モ ニ タ ー に よ る 動 画 広 告 を 新 庁 舎 内 に 導 入 し 新 庁 舎 の 主 要 機 能 の 一 つ で あ る 情 報 発 信 拠 点 と し て の 役 割 を 果 た す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ⅱ 国 地 方 公 共 団 体 公 共 公 益 法 人 等 の 消 費 税 Q&A ( 問 1) 免 税 期 間 における 起 債 の 償 還 元 金 に 充 てるための 補 助 金 等 の 使 途 の 特 定 Q 地 方 公 共 団 体 の 特 別 会 計 が 消 費 税 の 納 税 義 務 が 免 除 される 課 税 期 間
預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可
ミスミグループ コーポレートガバナンス 基 本 方 針 本 基 本 方 針 は ミスミグループ( 以 下 当 社 グループ という)のコーポレートガバナン スに 関 する 基 本 的 な 考 え 方 を 定 めるものである 1. コーポレートガバナンスの 原 則 (1) 当 社 グループのコーポレートガバナンスは 当 社 グループの 持 続 的 な 成 長 と 中 長 期 的 な 企 業 価 値 の
ていることから それに 先 行 する 形 で 下 請 業 者 についても 対 策 を 講 じることとしまし た 本 県 としましては それまでの 間 に 未 加 入 の 建 設 業 者 に 加 入 していただきますよう 28 年 4 月 から 実 施 することとしました 問 6 公 共 工 事 の
3 月 1 日 ( 火 )HP 公 表 基 本 関 係 社 会 保 険 等 未 加 入 対 策 に 関 する 想 定 問 答 問 1 社 会 保 険 等 とは 何 か 社 会 保 険 ( 健 康 保 険 及 び 厚 生 年 金 保 険 )と 労 働 保 険 ( 雇 用 保 険 )を 指 します 問 2 どのような 場 合 でも 元 請 と 未 加 入 業 者 との 一 次 下 請 契 約 が 禁 止
2. ど の 様 な 経 緯 で 発 覚 し た の か ま た 遡 っ た の を 昨 年 4 月 ま で と し た の は 何 故 か 明 ら か に す る こ と 回 答 3 月 17 日 に 実 施 し た ダ イ ヤ 改 正 で 静 岡 車 両 区 の 構 内 運 転 が 静 岡 運
地 本 業 務 ニ ュ ー ス J R 東 海 労 静 岡 地 方 本 部 NO.1 8 2 0 1 2 年 6 月 1 9 日 発 行 者 : JR 東 海 労 静 岡 地 方 本 部 山 本 繁 明 申 6 号 に 関 する 幹 事 間 折 衝 を 開 催!! 6 月 15 日 地 本 は 静 岡 車 両 区 に お け る 構 内 運 転 士 に 対 す る 誤 支 給 及 び 戻 入 に つ
あいち電子調達共同システム
(2) 提 出 依 頼 書 の 確 認 提 出 依 頼 書 が 発 行 されると 利 用 者 登 録 で 指 定 したメールアドレスへお 知 らせが 送 信 されま すので 提 出 依 頼 書 を 確 認 します 調 達 案 件 一 覧 画 面 で 案 件 情 報 を 確 認 し 提 出 依 頼 書 を 表 示 します 操 作 1 調 達 案 件 検 索 画 面 で 検 索 条 件 を 入 力 し
MetaMoJi ClassRoom/ゼミナール 授業実施ガイド
本 書 では 管 理 者 向 けに MetaMoJi ClassRoom/ゼミナールで 年 度 更 新 を 実 施 する 手 順 について 説 明 して います 管 理 者 ガイドと 合 わせてご 覧 ください Excelは 米 国 Microsoft Corporationの 米 国 およびその 他 の 国 における 登 録 商 標 または 商 標 です Apache OpenOffice Apache
スライド 1
公 的 年 金 制 度 の 健 全 性 及 び 信 頼 性 の 確 保 のための 厚 生 年 金 保 険 法 等 の 一 部 を 改 正 する 法 律 について 厚 生 労 働 省 年 金 局 公 的 年 金 制 度 の 健 全 性 及 び 信 頼 性 の 確 保 のための 厚 生 年 金 保 険 法 等 の 一 部 を 改 正 する 法 律 ( 平 成 25 年 法 律 第 63 号 )の 概 要
私立大学等研究設備整備費等補助金(私立大学等
私 立 大 学 等 研 究 設 備 整 備 費 等 補 助 金 ( 私 立 大 学 等 研 究 設 備 等 整 備 費 ) 交 付 要 綱 目 次 第 1 章 通 則 ( 第 1 条 - 第 4 条 ) 第 2 章 私 立 大 学 等 ( 第 5 条 - 第 15 条 ) 第 3 章 専 修 学 校 ( 第 16 条 - 第 25 条 ) 第 4 章 補 助 金 の 返 還 ( 第 26 条 ) 第
<4D6963726F736F667420576F7264202D2095CA8E863136816A90DA91B18C9F93A289F1939A8F9181698D8288B3816A5F4150382E646F63>
接 続 検 討 回 答 書 ( 高 圧 版 ) 別 添 様 式 AP8-20160401 回 答 日 年 月 日 1. 申 込 者 等 の 概 要 申 込 者 検 討 者 2. 接 続 検 討 の 申 込 内 容 発 電 者 の 名 称 発 電 場 所 ( 住 所 ) 最 大 受 電 電 力 アクセス の 運 用 開 始 希 望 日 3. 接 続 検 討 結 果 (1) 希 望 受 電 電 力 に
弁護士報酬規定(抜粋)
はなみずき 法 律 事 務 所 弁 護 士 報 酬 規 定 ( 抜 粋 ) 2008 年 10 月 改 訂 2014 年 4 月 * 以 下 の 弁 護 士 報 酬 は いずれも 税 込 です ただし D E L の2の 表 に 基 づき 算 出 さ れた 金 額 については 消 費 税 を 上 乗 せした 額 を 弁 護 士 報 酬 とします 目 次 A 法 律 相 談 料 B 顧 問 料 C 手
R4財務対応障害一覧
1 仕 訳 入 力 仕 訳 入 力 時 摘 要 欄 で. + Enter を 押 すと アプリケーションでエラーが 発 生 しまインデックスが 配 列 の 境 界 外 です が 出 る 場 合 がある 問 題 に 対 応 しま 2 仕 訳 入 力 仕 訳 入 力 主 科 目 と 補 助 科 目 を 固 定 にすると2 行 目 以 降 の 補 助 科 目 コピーが 動 作 しない 問 題 に 対 応
目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13
積 算 内 訳 書 の 作 成 マニュアル 平 成 26 年 1 形 県 県 整 備 部 建 設 企 画 課 目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 )
<4D6963726F736F667420576F7264202D208DE3905F8D8291AC8B5A8CA48A948EAE89EF8ED0208BC696B18BA492CA8E64976C8F91816995BD90AC3237944E378C8E89FC92F994C5816A>
第 1 編 共 通 業 務 共 通 仕 様 書 平 成 27 年 7 月 第 1 章 一 般 1.1 目 的 業 務 共 通 仕 様 書 ( 以 下 技 研 仕 様 書 という )は 阪 神 高 速 技 研 株 式 会 社 ( 以 下 会 社 という )が 発 注 する 調 査 検 討 資 料 作 成 設 計 補 助 測 量 作 業 その 他 こ れらに 類 する 業 務 に 係 る 業 務 請 負
第2回 制度設計専門会合 事務局提出資料
第 3 回 制 度 設 計 専 門 会 合 事 務 局 提 出 資 料 ~ 電 力 の 小 売 営 業 に 関 する 指 針 ( 案 )の 概 要 について~ 平 成 27 年 12 月 4 日 ( 金 ) 電 力 の 小 売 営 業 に 関 する 指 針 ( 案 )で 整 備 する の 目 次 1. 需 要 家 への 適 切 な 情 報 提 供 (1) 一 般 的 な 情 報 提 供 (2) 契
一般競争入札について
( 一 般 競 争 入 札 ) 総 合 評 価 落 札 方 式 ガイドライン 平 成 21 年 4 月 ( 独 ) 工 業 所 有 権 情 報 研 修 館 1.はじめに 現 在 公 共 調 達 の 透 明 性 公 正 性 をより 一 層 めることが 喫 緊 の 課 題 とな っており 独 立 行 政 法 人 も 含 めた 政 府 全 体 で 随 意 契 約 の 見 直 しに 取 り 組 んで おります
積 載 せず かつ 燃 料 冷 却 水 及 び 潤 滑 油 の 全 量 を 搭 載 し 自 動 車 製 作 者 が 定 める 工 具 及 び 付 属 品 (スペアタイヤを 含 む )を 全 て 装 備 した 状 態 をいう この 場 合 に おいて 燃 料 の 全 量 を 搭 載 するとは 燃 料
別 添 72 後 退 灯 の 技 術 基 準 1. 適 用 範 囲 等 この 技 術 基 準 は 自 動 車 に 備 える 後 退 灯 に 適 用 する( 保 安 基 準 第 40 条 関 係 ) ただし 法 第 75 条 の2 第 1 項 の 規 定 によりその 型 式 について 指 定 を 受 けた 白 色 の 前 部 霧 灯 が 後 退 灯 として 取 付 けられている 自 動 車 にあっては
01_07_01 データのインポート_エクスポート_1
データのインポート/エクスポートについて 概 要 スタッフエクスプレスでは 他 のソフトウェアで 作 成 されたスタッフデータ 得 意 先 データなどを 取 り 込 む(インポートする)ことができます また スタッフエクスプレスに 登 録 済 みのデータを Excel 形 式 CSV 形 式 で 出 力 (エクスポート)す ることができます 注 意 インポートできるデータは 次 の 条 件 を 満
TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合
TIPS 目 次 TIPS 項 目 棚 割 りを 開 始 するまで 商 品 画 像 の 追 加 方 法 商 品 情 報 の 一 括 更 新 登 録 方 法 棚 割 情 報 の 連 携 方 法 小 売 様 棚 割 ソフトとの 棚 割 情 報 連 携 について 他 棚 割 ソフトとの 棚 割 情 報 連 携 について 棚 割 情 報 のExcel 取 込 について 棚 板 設 定 の 詳 細 商 品 設
「1 所得税及び復興特別所得税の確定申告書データをお持ちの方」からの更正の請求書・修正申告書作成編
既 に 提 出 した 所 得 税 及 び 復 興 特 別 所 得 税 の 確 定 申 告 の 申 告 額 に 誤 り があった 場 合 で 納 める 税 金 が 多 すぎた 場 合 や 還 付 される 税 金 が 少 なす ぎた 場 合 に 提 出 する 更 正 の 請 求 書 や 申 告 をした 税 額 等 が 実 際 より 少 な すぎた 場 合 や 還 付 される 税 金 が 多 すぎた 場
(Microsoft Word - \203A \225\345\217W\227v\227\314 .doc)
ま ち づ く り 推 進 の た め の ア ン ケ ー ト 調 査 及 び 分 析 業 務 委 託 プ ロ ポ ー ザ ル 募 集 要 領 1 趣 旨 本 要 領 は, ま ち づ く り 推 進 の た め の ア ン ケ ー ト 調 査 及 び 分 析 業 務 委 託 の 受 託 者 を 特 定 す る た め, 企 画 提 案 型 プ ロ ポ ー ザ ル 方 式 ( 以 下 プ ロ ポ ー
Microsoft PowerPoint - 130522_リビジョンアップ案内_最終.pptx
WaWaOfficeシリーズ バージョン8.2リビジョンアップ 2013 年 6 月 18 日 リリース 予 定 株 式 会 社 アイアットOEC ローカル 機 能 の 改 善 プレビュー 表 追 加 の 覧 表 にプレビュー 表 を 設 定 可 能 にしました 1 表 2 表 1 +プレビュー 表 から 選 択 設 定 法 個 設 定 個 設 定 基 本 設 定 PC 専 パラメータの 覧 表 時
は 固 定 流 動 及 び 繰 延 に 区 分 することとし 減 価 償 却 を 行 うべき 固 定 の 取 得 又 は 改 良 に 充 てるための 補 助 金 等 の 交 付 を 受 けた 場 合 にお いては その 交 付 を 受 けた 金 額 に 相 当 する 額 を 長 期 前 受 金 とし
3 会 計 基 準 の 見 直 しの 主 な 内 容 (1) 借 入 金 借 入 金 制 度 を 廃 止 し 建 設 又 は 改 良 に 要 する 資 金 に 充 てるための 企 業 債 及 び 一 般 会 計 又 は 他 の 特 別 会 計 からの 長 期 借 入 金 は に 計 上 することとなりまし た に 計 上 するに 当 たり 建 設 又 は 改 良 等 に 充 てられた 企 業 債 及
<4D6963726F736F667420576F7264202D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A83858341838B8169342E33566572816A2E646F63>
商 品 管 理 商 品 管 理 を 行 うためのメニューです 4.1 商 品 管 理 のサイドメニュー 商 品 管 理 には 以 下 のサイドメニューがあります 商 品 一 覧 登 録 済 みの 商 品 の 一 覧 を 表 示 します 既 に 登 録 済 みの 商 品 の 検 索 検 索 した 商 品 を 編 集 する 際 に 使 用 します 新 規 作 成 商 品 を 新 規 登 録 する 画 面
<4D6963726F736F667420576F7264202D2032303130303492B796EC8CA7835C83748367834583468341836F815B8357838783938341836283762E646F63>
長 野 県 建 設 部 御 中 CALS/EC ソフトウェア バージョンアップについて 平 成 22 年 4 月 川 田 テクノシステム 株 式 会 社 1. 弊 社 の CALS 対 応 ソフトウェアシステムについて 現 状 のシステム 構 成 現 在 導 入 されているソフトウェアは 下 記 の 構 成 となっております 1 電 子 納 品 検 査 閲 覧 ソフトウェア 電 納 ヘルパー 発
の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は
小 牧 市 地 域 防 犯 カ メ ラ 等 設 置 補 助 金 交 付 要 綱 平 成 2 8 年 3 月 2 2 日 2 7 小 市 安 第 7 5 7 号 ( 通 則 ) 第 1 条 小 牧 市 地 域 防 犯 カ メ ラ 等 設 置 補 助 金 ( 以 下 補 助 金 と い う )の 交 付 に つ い て は 市 費 補 助 金 等 の 予 算 執 行 に 関 す る 規 則 ( 昭 和
返還同意書作成支援 操作説明書
返 還 金 同 意 書 等 作 成 支 援 操 作 説 明 書 当 EXCELを 使 用 することにより 以 下 のものを 作 成 できます 返 還 同 意 書 保 険 者 別 返 還 金 額 一 覧 表 返 還 内 訳 表 返 還 集 計 表 1 返 還 金 同 意 書 等 作 成 支 援 (EXCEL 形 式 )を 開 きます 2 タイトル 画 面 が 数 秒 間 表 示 されますので 注 意
資料25-3-2 H3ロケットへの移行に関する課題と対応
資 料 25-3-2 科 学 技 術 学 術 審 議 会 研 究 計 画 評 価 分 科 会 宇 宙 開 発 利 用 部 会 ( 第 25 回 )H28.2.2 H3ロケットへの 移 行 に 関 する 課 題 と 対 応 2016 02 02 防 衛 宇 宙 ドメイン 宇 宙 事 業 部 1. 目 的 本 資 料 は 宇 宙 基 本 計 画 に 謳 われた 以 下 への 対 応 についてまとめる 宇
(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt)
ACAD-DENKI DENKI Ver.12 新 機 能 / 改 善 機 能 アルファテック 株 式 会 社 1 新 機 能 改 善 機 能 一 覧 ACAD-DENKI/EL Ver.12 新 機 能 と 改 善 機 能 新 メニュー/ 新 機 能 拡 張 プロジェクト 管 理 外 部 端 子 コネクタ 端 子 ネット 分 割 化 リアルタイム 線 番 挿 入 改 善 項 目 図 題 情 報 編
<4D F736F F D F8D828D5A939982CC8EF68BC697BF96B38F9E89BB82CC8A6791E52E646F63>
平 成 22 年 11 月 9 日 高 校 等 の 授 業 料 無 償 化 の 拡 大 検 討 案 以 下 は 大 阪 府 の 検 討 案 の 概 要 であり 最 終 的 には 平 成 23 年 2 月 議 会 での 予 算 の 議 決 を 経 て 方 針 を 確 定 する 予 定 です Ⅰ. 検 討 案 の 骨 子 平 成 23 年 度 から 大 阪 の 子 どもたちが 中 学 校 卒 業 時 の
4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10
2 科 学 研 究 費 助 成 事 業 のトップページ 画 面 が 表 示 されます [ 研 究 者 ログイン]をクリック します 掲 載 している 画 面 は 例 示 です 随 時 変 更 されます 3 科 研 費 電 子 申 請 システムの 応 募 者 ログイン 画 面 が 表 示 されます e-rad の ID パ ス ワード を 入 力 し [ログイン]をクリックします 9 4 応 募 者
4 参 加 資 格 要 件 本 提 案 への 参 加 予 定 者 は 以 下 の 条 件 を 全 て 満 たすこと 1 地 方 自 治 法 施 行 令 ( 昭 和 22 年 政 令 第 16 号 ) 第 167 条 の4 第 1 項 各 号 の 規 定 に 該 当 しない 者 であること 2 会 社
北 秋 田 市 クリーンリサイクルセンターエネルギー 回 収 推 進 施 設 等 長 期 包 括 的 運 転 維 持 管 理 業 務 委 託 に 係 る 発 注 支 援 業 務 公 募 型 プロポ-ザル 実 施 要 領 1 プロポーザルの 目 的 この 要 領 は 平 成 30 年 4 月 から 運 転 を 予 定 している 北 秋 田 市 クリーンリサイクルセンター エネルギー 回 収 推 進 施
平成27年度大学改革推進等補助金(大学改革推進事業)交付申請書等作成・提出要領
平 成 7 年 度 大 学 改 革 推 進 等 補 助 金 ( 大 学 改 革 推 進 事 業 ) 交 付 申 請 書 等 作 成 提 出 要 領 交 付 申 請 等 に 当 たっては 大 学 改 革 推 進 等 補 助 金 ( 大 学 改 革 推 進 事 業 ) 取 扱 要 領 ( 以 下 取 扱 要 領 という ) も 参 照 の 上 以 下 の 関 係 書 類 を 作 成 し 各 大 学 短
研究者情報データベース
研 究 者 情 報 管 理 システム 研 究 者 向 けデータ 一 括 登 録 機 能 操 作 マニュアル 2013 年 6 月 4 日 目 次 1. はじめに... 1 1.1 本 マニュアルの 注 意 事 項... 1 2. 操 作 手 順... 2 2.1 データ 登 録 手 順... 2 2.2 データ 読 み 込 みエラー 時 の 対 応 手 順... 13 3. 登 録 データ 一 覧...
<819A955D89BF92B28F91816989638BC690ED97AA8EBA81418FA48BC682CC8A8890AB89BB816A32322E786C7378>
平 成 27 年 度 施 策 評 価 調 書 施 策 の 名 称 等 整 理 番 号 22 評 価 担 当 課 営 業 戦 略 課 職 氏 名 施 策 名 ( 基 本 事 業 ) 商 業 の 活 性 化 総 合 計 画 の 位 置 づけ 基 本 目 主 要 施 策 4 想 像 力 と 活 力 にあふれたまちづくり 商 業 の 振 興 2 施 策 の 現 状 分 析 と 意 図 施 策 の 対 象 意
平成25年度 独立行政法人日本学生支援機構の役職員の報酬・給与等について
平 成 25 年 度 独 立 行 政 法 日 本 学 生 支 援 機 構 の 役 職 員 の 報 酬 給 与 等 について Ⅰ 役 員 報 酬 等 について 1 役 員 報 酬 についての 基 本 方 針 に 関 する 事 項 1 平 成 25 年 度 における 役 員 報 酬 についての 業 績 反 映 のさせ 方 日 本 学 生 支 援 機 構 は 奨 学 金 貸 与 事 業 留 学 生 支 援
1 総 合 設 計 一 定 規 模 以 上 の 敷 地 面 積 及 び 一 定 割 合 以 上 の 空 地 を 有 する 建 築 計 画 について 特 定 行 政 庁 の 許 可 により 容 積 率 斜 線 制 限 などの 制 限 を 緩 和 する 制 度 である 建 築 敷 地 の 共 同 化 や
参 考 資 料 1-17 民 間 都 市 整 備 事 業 建 築 計 画 に 関 わる 関 連 制 度 の 整 理 都 市 開 発 諸 制 度 には 公 開 空 地 の 確 保 など 公 共 的 な 貢 献 を 行 う 建 築 計 画 に 対 して 容 積 率 や 斜 線 制 限 などの 建 築 基 準 法 に 定 める 形 態 規 制 を 緩 和 することにより 市 街 地 環 境 の 向 上 に
0 目 次 1. 畑 のあしあとの 使 い 方 P.3 2.オプション P.6 3.モバイルデバイスより 履 歴 取 得 P.8 4. 基 本 情 報 管 理 P.11 5. 栽 培 計 画 P.22 6.ドキュメント 出 力 P.25 7. 栽 培 履 歴 管 理 P.28 8.モバイルでの 栽
畑 のあしあと 詳 細 マニュアル 1 0 目 次 1. 畑 のあしあとの 使 い 方 P.3 2.オプション P.6 3.モバイルデバイスより 履 歴 取 得 P.8 4. 基 本 情 報 管 理 P.11 5. 栽 培 計 画 P.22 6.ドキュメント 出 力 P.25 7. 栽 培 履 歴 管 理 P.28 8.モバイルでの 栽 培 履 歴 登 録 P.31 2 1 畑 のあしあとの 使 い
<31352095DB8CAF97BF97A6955C2E786C73>
標 準 報 酬 月 額 等 級 表 ( 厚 生 年 金 ) 標 準 報 酬 報 酬 月 額 厚 生 年 金 保 険 料 厚 生 年 金 保 険 料 率 14.642% ( 平 成 18 年 9 月 ~ 平 成 19 年 8 月 ) 等 級 月 額 全 額 ( 円 ) 折 半 額 ( 円 ) 円 以 上 円 未 満 1 98,000 ~ 101,000 14,349.16 7,174.58 2 104,000
その 他 事 業 推 進 体 制 平 成 20 年 3 月 26 日 に 石 垣 島 国 営 土 地 改 良 事 業 推 進 協 議 会 を 設 立 し 事 業 を 推 進 ( 構 成 : 石 垣 市 石 垣 市 議 会 石 垣 島 土 地 改 良 区 石 垣 市 農 業 委 員 会 沖 縄 県 農
国 営 かんがい 排 水 事 業 石 垣 島 地 区 事 業 の 概 要 本 事 業 は 沖 縄 本 島 から 南 西 約 400kmにある 石 垣 島 に 位 置 する 石 垣 市 の4,338haの 農 業 地 帯 において 農 業 用 水 の 安 定 供 給 を 図 るため 農 業 水 利 施 設 の 改 修 整 備 を 行 うものである 事 業 の 目 的 必 要 性 本 地 区 は さとうきびを
