OpenGL ES
OpenGL for Embedded SystemsOpenGL ESはOpenGLの簡易版で、冗長性を排除し、習得が容易でモバイルグラフィックスハードウェアへの実装が容易なライブラリを提供します。これは、ハンドヘルドおよび組み込みアプリケーションをターゲットとした高レベルの3DグラフィックスAPIであり、今日のスマートフォンで支配的なグラフィックスAPIです。 対応プラットフォーム:iOS、Andriod、BlackBerry、Linux、Windows。
OpenGL ESのクロスプラットフォーム実装は、iOSとAndriodが共通のウィンドウを共有することを意味しません。 なぜなら、OpenGL ESはインターフェースAPIのセットに過ぎないからです。 したがって、iOSもAndriodも、OpenGL ESのための独自のキャリアを提供する必要があります。
GLView,GLViewControllerOpenGL ESのキャリアは.クロスプラットフォーム部分とは、GLSLで書かれた頂点シェーダーとピースワイズシェーダーのコードスニペットのことです。
クライアント・サーバ・アーキテクチャとしてのOpenGL ES
CPU
1.appOpenGL ES API経由でOpenGL ESフレームワークを呼び出す。 2.OpenGL ES framework OpenGL ESサーバーにグラフィックス・データを渡すGPU
1.グラフィックス・ハードウェアは、グラフィックス・データ、ラスタライズ、レンダリングを処理する。
OpenGL ESグラフィックス・パイプライン
- APIから頂点データを取得し、メモリから頂点バッファにコピーします。
- 頂点バッファから頂点シェーダに頂点データを渡し、テクスチャ座標も頂点シェーダに渡す必要があり、グラフィック要素は描画接続によって組み立てられ、頂点がどのようなグラフィックであるかを決定します。描画方法についてはOpenGL Rendering Squares & Translations を参照してください。
- ラスタライズステップは、グラフィックを画面上のどこに配置するかを決定します。
- ピースワイズシェーダはグラフィックピクセルのカラー値を処理するのに使われ、処理されたカラー値をモニタに表示するためにフレームバッファに保存します。
上の図からわかるように、APIで操作できるのは頂点バッファ、頂点シェーダ、テクスチャ座標、ピースワイズシェーダだけで、それ以外はアクセスできません。
処理の公式説明
描画コマンドを実行して頂点データをパイプラインに送ります。パイプラインの連続したフェーズでは、頂点シェーダを実行して頂点データを処理し、頂点をタプルに組み立て、タプルをフラグメントにラスタライズし、フラグメントシェーダを実行して各フラグメントの色と深度値を計算し、フラグメントをフレームバッファにブレンドして表示します。
- アプリコードは、タプルアセンブリの頂点情報、イメージ情報を提供します。
- 頂点:回転、平行移動、スケーリングなどの頂点情報を処理します。
- ジオメトリ(Geometry):タプルのアセンブリ、および領域の切り取り。
- フラグメント:テクスチャ、フォグ処理用のフラグメントシェーダ。
- フレームバッファ操作:処理されたデータは、透明度、モデリング、深度テスト、および最終的なブレンドブレンドのためにフレームバッファに送信されます。
このプロセスでは、操作の一部のみを説明し、操作は説明しません。
頂点シェーダー
頂点シェーダとは、頂点に対して演算を行うシェーダプログラムのソースコード/実行形式を記述したものです。
シェーダーは、コードがGPUによって実行されることを除けば、実際にはコードスニペット、関数、またはメソッドに似ています...
入力
1.属性 atttubute:頂点配列を使って頂点ごとのデータを提供する 2.ユニフォーム変数:頂点シェーダーやスライス・シェーダーにおいて、変化しない色の値など、一定に保たれるデータを入力するために使用される。 3. :テクスチャ座標など、バーテックス・シェーダーで使用されるテクスチャを表す特別な一様変数型。出力
1.gl_Position:GLSLの組み込み変数で、頂点処理の結果が代入される。, 2.gl_PointSize:頂点サイズは、頂点ポイント・シェーダーで変更できる。
頂点シェーダのビジネス
- 行列変換位置
投影行列とモデルビュー行列の変更は、頂点シェーダで計算されます。
- ライティングモードの計算、頂点ごとの色の生成
- テクスチャ座標の生成/変換
上記のグラフィカルパイプラインからわかるように、ピースワイズシェーダにはテクスチャ座標アトリビュートを渡す入力アトリビュート値がないため、頂点シェーダを使用してテクスチャ座標アトリビュートをブリッジし、ピースワイズシェーダに渡す必要があります。
頂点シェーディングのコード例
attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
varying lowp vec2 varyTextCoord;
void main()
{
varyTextCoord = textCoordinate; // テクスチャ座標をブリッジする
vec4 vPos = position;
vPos = vPos * rotateMatrix; // 頂点回転行列の乗算
gl_Position = vPos; // 乗算の結果は、gl_Position
}
要素アセンブリ
頂点シェーダの次のステップ:イメージアセンブリ
プリミティブ:点、線、三角形
プリミティブアセンブリ:頂点データはプリミティブに計算されます。この段階で、トリミング、パースペクティブ分割、およびViewPort変換が実行されます。
ラスタライズ
ラスタライズとは、タプルを2次元フラグメントのセットに変換するプロセスで、変換されたフラグメントはフラグメントシェーダによって処理されます。
ピクセルポイントは2次元なので、2次元フラグメントに変換されます。フラグメントシェーダはピクセルの数だけ実行されます。フラグメントシェーダは GPU によって同時に実行されるため、性能に深刻な問題はありません。
チップシェーダ
フラグメントシェーダとは、フラグメントに対して演算を行うシェーダプログラムのソースコード/実行形式を記述したシェーダプログラムのことです。
入力セクション
1.頂点シェーダー・ブリッジからの入力、単位化された色、テクスチャー座標など。 2.ユニフォーム変数: /チップ・シェーダーで使用される不変データ 3. :チップ・シェーダーで使用されるテクスチャ用の特殊な統一変数型,出力セクション
1.gl_FragColor:ピクセルをピースワイズシェーダーで処理した結果。
チップシェーダーのビジネス
- ピクセルポイントの色を計算
- ピクセルテクスチャ値を取得
- ピクセル点をカラー値で塗りつぶし
ピースワイズシェーダの使用例:イメージフィルタ→イメージピクセルを処理→新しい色を取得→フレームバッファに格納→表示。
チップシェーダのコード例
varyinglowpvec2varyTextCoord;
uniformsampler2DcolorMap;
voidmain()
{
gl_FragColor=texture2D(colorMap,varyTextCoord);
}
フラグメントごとの処理
- Pixel Attribution Test(ピクセル帰属テスト):フレームバッファ内のある位置のピクセルが、現在OpenGL ESによって所有されているかどうかを判定します。例えば、OpenGL ESフレームバッファを表示しているViewが他のViewによってマスクされている場合。ポートシステムは、マスクされたピクセルがOpenGL ESコンテキストファイルに属していないと判断できます。ウィンドウシステムは、マスクされたピクセルがOpenGL ESコンテキストファイルに属していないと判断し、それらを完全に表示しないことができます。 ピクセル帰属テストはOpenGL ESの一部であり、開発者の制御下にはありませんが、OpenGL ESによって内部的に実行されます。
- クロップテスト: クロップテストは、セグメントがOpenGL ESの状態の一部である切り抜き矩形内にあるかどうかを判定します。セグメントが切り抜き領域の外側にある場合、そのセグメントは破棄されます。
- 深度テスト(Depth Test): 深度コントラストを入力することで、セグメントが拒否されるかどうかを判断します。
- ブレンド(Blending): ブレンドは、新しく作成されたセグメントの色と、フレームバッファに保存された位置の色を組み合わせます。
- ディザリング(Dithering): 限られた精度でフレームバッファに値を保存する際に生じるアーティファクトを最小限に抑えるためにディザリングを使用できます。
開発者は内部実装にアクセスできず、GPU の内部処理であるスイッチング操作しか実行できないため、これは理解段階です。
EGL(Embedded Graphics Library)
- OpenGL ESコマンドは、コンテキストをレンダリングし、グラフィックイメージの描画を完了するために表面を描画する必要があり、iOSでOpenGL ESはキャリアとしてGLKitフレームワーク、GLKView、GLKViewControllerを提供しています。
- レンダリングコンテキスト:関連するOpenGL ESの状態を保存します。
- 描画サーフェス:イメージの描画に使用されるサーフェスで、カラーバッファ、深度バッファ、ステンシルバッファなど、レンダリングに必要なバッファのタイプを指定します。
- OpenGL ES APIは、レンダリングコンテキストの作成方法や、それらを元の出力システムに接続する方法に関する情報を提供しません。 EGLは、KhronosのレンダリングAPI(OpenGL ESなど)とオリジナルのウィンドウ・システムとの間のインターフェースです。
EGLではなくOpenGL ESをサポートしている唯一のプラットフォームはiOSである。. Apple EAGLと呼ばれるEGL APIの独自のiOS実装を提供する。.
GLKitフレームワークの概要
GLKitは、数学ライブラリ、背景テクスチャの読み込み、事前に作成されたシェーダー効果、および標準的なビューとビューコントローラを使用してレンダリングループを実装するために使用することができます。新しいシェーダーベースのアプリケーションを作成するのに必要な労力を軽減する機能とクラスを提供します。
- GLKView: ビューを描画する場所を提供します。
- GLKViewController: 描画ビューのコンテンツを管理し、レンダリングするために UIKit を拡張します。
OpenGL ESはAppleによって廃止されましたが、iOS開発者は引き続き使用できます。





