blog

OpenGL ES入門

フラグメントシェーダの入出力を下図に示します。 バーテックスシェーダとフラグメントシェーダは、iOS の関数/メソッドに似たコードスニペットで、戻り値があります。 どちらの戻り値もGLSLの組み込み変...

Jan 21, 2021 · 5 min. read
シェア
  • OpenGL ESこれはOpenGLのサブセットです。
  • OpenGL ESは、組込み機器やiOS、Android、Windowsなどのモバイル機器向けの高度な3Dグラフィックスアプリケーションです。
  • OpenGL ESはクロスプラットフォームであり、ウィンドウ関連のメソッドを提供しないため、システムは独自のキャリアを用意する必要があります。

OpenGL ESレンダリング処理

イメージは「 」より引用

OpenGL ESのレンダリングは、CPUとGPUの2つの部分に分かれています。

  • GPUセクション

    ラスタライズや表示など、グラフィックスのハードウェア処理を行います。

OpenGL ES グラフィックスパイプライン

OpenGL ESグラフィックス・パイプラインは、以下の2つの方法で説明されます。

図1

  • 頂点データを取得し、頂点データをメモリから頂点バッファにコピーするAPI
  • テクスチャ座標はテクスチャ・チャンネルを通してバーテックス・シェーダとスライス・シェーダに渡されます。
  • このステップでは、頂点をグラフに変換します。
  • ラスタライズ:グラフィックがスクリーンのどこに対応するかを決定します。
  • フラグメント/セグメント/ピクセルシェーダ:対応するピクセルポイントの色値を処理します。
  • 各ピクセルポイントの処理された色値をフレームバッファに格納した後、モニターに表示します。
  • API:頂点バッファ、頂点シェーダ、テクスチャ座標、フラグメントシェーダをAPIで操作可能

Apple公式イメージ

イメージは「 」より引用

  • アプリ:グラフィックアセンブリの頂点情報、イメージ情報の提供
  • 頂点:頂点の取り扱い -- グラフィカルな変換
  • Geometryメタファブリケーション+
  • フラグメント:テクスチャリング+アトマイゼーション
  • フレームバッファの操作:透明度のブレンド、テンプレート化、深度テスト、そして最終的なブレンド。

頂点シェーダ

頂点シェーダーは頂点のシェーダープログラムを処理し、頂点シェーダーの入出力は以下の通りです。

  • 入力には3つの方法があります。 1. 属性チャンネルを介した頂点データ(頂点ごとのデータを提供) 2. ユニフォームチャンネルを介したユニフォーム変数(頂点/スライス・シェーダで使用される不変データ) 3. サンプラー:頂点シェーダで使用されるテクスチャを表す特別なユニフォーム変数タイプ

  • 出力: 処理された最終頂点データ。

    1. gl_PositionはGLSLの組み込み変数で、処理された最終頂点データが代入されます。
    2. gl_PointSizeは、点のサイズです。つまり、各点のサイズはバーテックスシェーダで変更できます。

頂点シェーダーが処理する操作

  • 行列変換位置
  • 頂点ごとの色を生成するための照明式の計算
  • テクスチャ座標の生成/変換:ピースワイズシェーダにアトリビュートを渡す方法はありません。バーテックスシェーダのブリッジングを通じて、間接的にピースワイズシェーダにテクスチャ座標アトリビュートを渡すことは可能です。

頂点シェーダーGLSLコード例

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; 
}
  • 属性、一様 クライアントとサーバ間のチャネルを示します。
  • ここで、vec4, vec2 はベクトル型で、4 次元ベクトルと 2 次元ベクトルを表します。
  • mat4 *4
  • varying は修飾子です。テクスチャ座標は varying を介してスライスシェーダに渡されます。
  • lowp低精度
  • メインでの操作:1.テクスチャ座標ブリッジの実装、2.頂点回転行列の乗算の実装:列ベクトルと列行列の乗算、回転後の頂点座標の取得、3.上記で取得した頂点座標をgl_Positionに代入。

要素アセンブリ、ラスタライズ

  • 要素アセンブリ:個々の要素に頂点データを計算します。
  • ラスタライズ:ピクセルを2Dセグメントの集合に変換するプロセス。主に画面が2Dであるため、変換されたピクセルポイントも2Dになります。

フラグメントシェーダ

次の図は、スライス・シェーダの入力と出力を示しています。

  • 頂点シェーダと同様に、入力には3つの方法があります。

    1.頂点シェーダブリッジなどで渡されるテクスチャ座標。

    2.ユニフォームチャネルを通したユニフォーム変数の入力、すなわち頂点/スライス・シェーダで使用される不変データ。

    3.サンプラー:頂点シェーダーで使用されるテクスチャーを表す特殊な一様変数型。

  • 出力:

    スライスシェーダで処理されるピクセル点

ピースワイズシェーダーが処理する演算

  • 色の計算
  • テクスチャ値の取得
  • ピクセルをカラー値で塗りつぶします。

チップシェーダーGLSLコード例

varying lowp vec2 varyTextCoord; 
uniform sampler2D colorMap;
void main() {
gl_FragColor = texture2D(colorMap, varyTextCoord); }
  • varying: テクスチャ座標を渡せるように、頂点シェーダーとまったく同じにする必要があります。
  • sampler2D サンプラーの種類
  • texture2D(テクスチャサンプラー, テクスチャ座標): 対応する位置/座標のカラー値を取得します。
  • gl_FragColor: 最終的な色の値を割り当てます。

まとめ

  • バーテックス・シェーダーやスライス・シェーダーは、iOSの関数やメソッドに似たコード・スニペットで、戻り値があります。
  • これらの戻り値はどちらもGLSLの組み込み変数で、カプセル化されているので、データを代入するだけでOKです。
  • 頂点シェーダの戻り値は、頂点シェーダで頂点を処理した結果であるgl_Positionにコピーされ、フラグメントシェーダの結果は、フラグメントシェーダでピクセルを処理した結果であるgl_fragColorに代入されます。
Read next