OpenGL ES2.0 一問一答

Post on 15-Jul-2015

295 views 0 download

Transcript of OpenGL ES2.0 一問一答

OpenGL ES2.0 一問一答

もんぐり

最初に

・私はOpenGLや3Dグラフィックスについてはまだまだ勉強中です。

誤った言葉づかいや間違った説明をしたときは優しく優しくご指摘ください。

・私よりも詳しい方は社内におられると思います。私はグラフィックス関連

の技術や理論が大好きなので是非ご指導ご鞭撻いただきたく。

・この分野が好きな人は一緒に何かして遊びましょう

OpenGLとは?

「標準化団体Khronosグループが策定しているグラフィックスハードウェア

用のAPI。2次元・3次元コンピュータグラフィックス両方が扱える。」

・仕様がオープン。

・APIを実装するのはGPUのベンダー。

・OpenGL ESは、組み込み機器向けのサブセット。

・cocos2d-xやUnityは、iOSとAndroidではOpenGL ES2.0を使用している。

ここでいうグラフィックスハードウェアとは?

ディスプレイ描画や画像処理や3D処理を担当するハードウェア。

GPU、VRAMなどで構成される。

・PCのグラフィックスハードウェア

価格や用途により複数パターンあり

-ビデオカード(グラフィックカード)としてマザーボードと独立

-オンボードとしてマザーボードに一体化

-VRAMやGPU自体が独立して存在せずメインメモリやCPUと一体型

・スマホのグラフィックスハードウェア

-GPUはCPUと別だがVRAMがメインメモリと物理的に一体というケース

が多い。

「Graphics Processing Unit(グラフィックスプロセッシングユニット、略してGPU)とは、パー

ソナルコンピュータやワークステーション等の画像処理を担当する主要な部品のひとつ。

現在の高機能GPUは高速のVRAMと接続され、グラフィックスシェーディングに特化した演算器を複

数搭載するマイクロプロセッサとなっている。」

GPUとCPUの関係はサーバとクライアント、

GPUはCPUに画像処理を委託され、従属して動作する。

OpenGLはGPU制御用のAPIと考えて良い。

GPUとは?

CPU

GPU

メインメモリ

VRAM兼用ディスプレイ

iPhone5SのプロセッサA7の画像CPU:デュアルコア1.3GHz ARMv8、GPU:PowerVRG6430

※画像出典EE TimesJapan

「iPhone 5sのプロセッサ「A7」を解析」

GPUとCPUの違いって?

CPU GPU

コア数 一、二桁(2コア) 三、四桁(100程度)

できること 豊富 浮動小数点ベクトル演算くらい

()内はA7の例

GPUは3Dモデルや画像データ(どちらも浮動小数点ベクトルデータ)の大量

並列演算に特化している

GPUって本当に必要なのか?

ゲームをすべてCPUで処理するとどうなるか

・全頂点の位置計算

例:社内製スマホ3Dゲームのキャラクター3Dモデル

一体、3000〜5000頂点

・画面の全ピクセルでのブレンドやz座標を考慮した表示色の計算

例:iPhone4S

640×960 = 65万ピクセル

60FPS=0.016秒以内でこれらの浮動小数点数ベクトルのデータをつぎつぎに

扱う

大量並列演算のできる専用のハードウェアを使わないと負荷が大きい

スマホのGPUは?

Tegraシリーズ(NVIDIA)

Nexus7など

Maliシリーズ(ARM)

Galaxy S3αなど

Adrenoシリーズ(Qualcomm)

Nexus5など

PowerVRシリーズ(Imagination Technolygies)

Galaxy Nexus、iOS端末一般など

※cocos2d-xでは起動時にGPUのプロファイルをログ出力するよ!

※PCではGPU市場はNVIDIAとAMDの寡占状態

OpenGL ES2.0で何ができるのか?

・点、線、三角形を描画する

・テクスチャをはりつける

他にもいろいろあるが、主要な機能はこんなもの。低レベルなAPI。

低レベルAPIだからこそハードウェアの性能を引き出せるし、カスタマイズが

きく

→ ハイエンドだったりリアルタイムなグラフィックスレンダリング向き

(OSの用意した高レベルグラフィックスAPIやウィンドウシステムは遅く、

カスタマイズに制限がある)

OpenGL以外のGPU用APIは?

・DirectX(Direct3D)

MicrosoftのAPI

・Metal

iOS8と同時に発表されたiOSデバイス専用の薄いAPI

・GPUベンダーの自社製品用に開発されたAPI

CUDA(NVIDIA)、Mantle(AMD)など

OpenGL ES2.0の描画の手順って?

最終的に、ディスプレイに表示するピクセルデータ(フレームバッファ)を

用意すればよい。

①フレームバッファのクリア

②3Dモデルごとにレンダリングパイプラインを実行してフレームバッファに

描画していき、最終的画面描画を完成させる

③フレームバッファのディスプレイへの反映

※これはOpenGL ES2.0の仕事ではなく、OSのAPIを用いる

上記を毎フレーム行う。2Dの場合もz座標がないだけで流れは同じ。

※厳密にはフレームバッファを直接ディスプレイには反映しない(ダブルバ

ッファリング)

レンダリングパイプラインとは?

グラフィックスハードウェアの中で起こっている処理とデータの流れのこと

※1と2はCPU処理

※画像出典マイナビニュース「3Dグラフィックス・マニアックス」

OpenGL ES2.0のAPIにはどんなのがある?

頂点配列の設定 glVertexAttribPointer

テクスチャの設定 glBindTexture

使用するシェーダプログラムの設定 glUseProgram

フレームバッファへの描画の実行(ドローコール) glDrawXxx

ドローコールによって、設定した各種データを用いてレンダリングパイプラ

インが実行される

シェーダとは?

レンダリングパイプラインにおいて、頂点単位の処理、ピクセル単位の処理

をカスタマイズするためのプログラムのこと。

(元は名前どおり陰影処理から来ているが、それ以外のいろいろな表現用途

に使うことができる)

OpenGL ES2ではバーテックスシェーダとフラグメントシェーダの2箇所でパ

イプライン処理をカスタマイズ可能

※OpenGL ES1系では、この部分がAPIで指示できる範囲の決め打ちの処理に

なっており、カスタマイズ不能だった

バーテックスシェーダとは?

頂点パイプラインで実行するシェーダ

→ バーテックスシェーダ

GPUの複数コアで頂点単位で並列実行

フラグメントシェーダとは?

ピクセルパイプラインで行うシェーダ

→ フラグメントシェーダ(ピクセルシェーダ)

GPUの複数コアでピクセル単位で並列実行

バーテックスシェーダとは?2例:cocos2d-x

attribute vec4 a_position;

attribute vec2 a_texCoord;

attribute vec4 a_color;

varying lowp vec4 v_fragmentColor;

varying mediump vec2 v_texCoord;

void main()

{

gl_Position = CC_MVPMatrix * a_position;

v_fragmentColor = a_color;

v_texCoord = a_texCoord;

}

cocos2d-xで一番良く使われるバーテックスシェーダ。座標変換行列で画面上の頂点位置計算、頂点色とテクスチャのUV座標のフラグメントシェーダへの受け渡しをしている。各3Dモデルの頂点の数だけ実行される。※レンダリングパイプラインのES1系でのデフォルトの処理をしているのと変わらない

バーテックスシェーダとは?3例:フラットシェーディング、グーローシェーディング

両者、ライティング(光の陰影計算)の技法で、法線と光の方向をバーテッ

クシェーダーに与えて表面色への係数を計算する

・フラットシェーディング

ポリゴンごとに一意な法線ベクトルを持たせる

・グーローシェーディング

頂点ごとに法線ベクトルを持たせる。フラットシェーディングの発

展。

※画像出典マイナビニュース「3Dグラフィックス・マニアックス」など

フラグメントシェーダとは?2例:cocos2d-x

varying vec4 v_fragmentColor;

varying vec2 v_texCoord;

void main()

{

gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);

}

cocos2d-xで一番良く使われるフラグメントシェーダ。

バーテックスシェーダから与えられたテクスチャのUV座標を使ってテクスチャから取り出したテクセルに、やはり与えられた頂点色(ラスタライズによって補間)を乗算しているだけ。各3Dモデルのポリゴンのピクセルごとに実行される。

※レンダリングパイプラインのES1系でのデフォルトの処理をしているのと変わらない

フラグメントシェーダとは?3例:バンプマッピング

ライティング(光の陰影計算)の技法で、RGBAベクトルでなく法線ベクトル

をピクセルごとに定義したテクスチャをフラグメントシェーダに与え、ピク

セルごとに表面色を計算する

デザイナのためにシェーダを作成する必要があるのか?

シェーダは表現に関わる部分なのでデザイナに調整させたい。

→最近のゲームエンジンではシェーダ作成をGUIツール化してデザイナに提供

している。

・用意されたシェーダにパラメータを調整するもの

・処理をノードベースの操作で組み立てるもの

スマホにおけるOpenGLESの最適化手法は?

3Dにも2Dにも適用できる手段で定番のものを3つ。

①描画する頂点やテクスチャの容量を減らす

②ドローコールの数を減らす。

③バーテックスバッファなどのVRAMバッファを使用する。

②について

なるべく一回のドローコールで多くのポリゴンを描画する。

定番の手法はテクスチャアトラス(スプライトシート)。

3Dではマテリアルの切り替えを頻繁に行わないようなモデル作りを意識する

と良い。

2Dではノードツリートラバースでテクスチャの切り替えが多くならないよう

なツリー構成を意識すると良い。

おまけ:シェーダ同好会的なのを作りたいなー

作ったシェーダを自慢するだけとか

3Dグラフィックスやゲームの基幹技術が好きな人と遊べる場を何らかの形で

用意できればいいなと思っています。