上記の canvas 要素は、WebGL により描画しています。
canvas の中央に 1 つの点を表示しています。
シェーダーを使うまでの手順
WebGL は OpenGL ES 2.0、WebGL 2.0 は OpenGL ES 3.0 をベースに策定されているため、プリミティブをレンダリングするには、どちらも GLSL ES 言語で記述したシェーダーコード(頂点シェーダー、フラグメントシェーダー)を用意する必要があります。
シェーダーを使用して描画するまでの流れは下記のようになります。
- シェーダーオブジェクトの準備(頂点シェーダーとフラグメントシェーダー)
- シェーダーオブジェクトを作成する (gl.CreateShader)
- シェーダーコードを設定する (gl.ShaderSource)
- シェーダーコードをコンパイルする (gl.CompileShader)
- 必要があればコンパイル結果のチェック (gl.getShaderParameter)
- 必要があればコンパイルエラーの内容を出力 (gl.getShaderInfoLog)
- プログラムオブジェクトの準備
- プラグラムオブジェクトを作成する (gl.CreateProgram)
- 2 つのシェーダーオブジェクトをアタッチする (gl.AttachShader)
- 2 つのシェーダーオブジェクトをリンクする (gl.LinkProgram)
- 必要があればリンク結果のチェック (gl.getProgramParameter)
- 必要があればリンクエラーの内容を出力 (el.getProgramInfoLog)
- レンダリング前に使用するプログラムオブジェクトを選択する (gl.UseProgram)
- 頂点情報などを用意して描画 (gl.drawArrays)
ユーティリティ関数の作成
シェーダーオブジェクトの準備 (createShader)
指定したシェーダーコードをコンパイルしてシェーダーオブジェクトを作成する createShader
関数を作成します。
この関数を使って、頂点シェーダーとフラグメントシェーダーをコンパイルします。
プログラムオブジェクトの準備 (createProgram)
作成した 2 つのシェーダーを実際に使用するには、プログラムオブジェクトを作成してリンクする必要があります。
シェーダーオブジェクトからプログラムオブジェクトを作成する createProgram
関数を作成します。
上記コードで gl.attachShader
の直後に gl.deleteShader
を呼び出していますが、このタイミングでは削除フラグが立つだけです。シェーダーオブジェクトは、プログラムにアタッチされている状態では削除されない仕様なので、これは正しく動作します。
これで、下記のようにしてプログラムオブジェクトを作成することができます。
これは定型処理になるので、直接シェーダーコードを渡してプログラムオブジェクトを作成してしまうユーティリティ関数を用意しておくのもよいですね。
これで、下記のようにしてシェーダーのコードから直接プログラムオブジェクトを作成できます。
main プログラムの作成
シェーダーオブジェクトやプログラムオブジェクトを作成するユーティリティ関数の作成が終わったので、後はメインプログラムを作成します。
頂点シェーダーとフラグメントシェーダーのソースコードは、下記のように、直接 JavaScript でハードコーディングします。
ここでは、頂点を 1 つだけ表示するために、座標は画面中央 (0, 0, 0) に決め打ち、色も緑色で決め打ちにしています。
後は、gl.drawArrays 関数を使って、頂点を 1 つ描画する命令を発行すれば WebGL によるレンダリングが行われます。
関連記事