【WebGL】GLSLの頂点シェーダー(vertexShader バーテックスシェーダー)と頂点データ(attribute,頂点属性)とは?
WebGL(GLSL)を扱うときに必ずでてくる頂点シェーダー(vertexShader、バーテックスシェーダー)とは何か、何に使うのかについて説明します。
また、 attributeについても説明します。
頂点シェーダー(vertexShader、バーテックスシェーダー)とは
頂点シェーダー(vertexShader、バーテックスシェーダー)とは物体の頂点の位置を決定するためのプログラムのことです。
vertexは、頂点という意味の英語です。
具体的にはgl_Positionという特別な変数に格納された値が頂点の位置になります。
三角形なら3点の頂点の位置を決定するというイメージです。
それをGPUの特性を活かして、それぞれの頂点ごとに実行されます。
GPUの特性について、不明な場合は、WebGLとThree.jsの違いって何?を確認してみてください。
頂点の位置が決まるときの処理の流れ
JavaScriptから頂点データを転送して、GPU側に描画指示をします。
頂点シェーダが実行されます。たとえばJavaScriptで頂点数を3とした場合、3つの頂点の位置をgl_Positionに代入することでそれぞれの頂点の位置が決定されます。
頂点シェーダーのサンプルコード
attribute vec3 position;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 0.6);
}
上のような形で頂点シェーダーを記述します。
物体の各頂点ごとに上の頂点シェーダのコードが実行されるという点は、頭に残しておいた方が後々わかりやすくなると思います。
上のgl_Positionという変数に代入された値が、最終的な頂点の位置となります。
positionは頂点データ
上のコードのpositionは、頂点データと言われ、頂点ごとに保持できるデータをさします。
つまり、頂点データ名です。
三角形なら、3点の頂点データがあります。
頂点データ(頂点属性)とは
頂点データ(attributes of vertices, 頂点属性)とは、頂点ごとに保持できる頂点の値のことです。
頂点シェーダそれぞれで異なる値を渡すときに使います。
attributeはWebGLにおいて、データを受け渡しする一つの方法です。
他にも、varyingやuniformがあります。
頂点データ(頂点属性)の特徴
頂点データは、ユーザーが定義することができます。
定義できるデータにはたとえばposition(位置座標)、color(色の情報)、normal(法線ベクトル)、uv(UV座標)などがあります。
normalは、法線という面を直行する線の情報が入っています。
UV座標というのは、テクスチャを読み込むことに必要な座標です。
position, uv, normalはすでにThree.jsで定義されていて使うことができます。
BoxGeometryなどのジオメトリのattributesの中にposition,normal,uvがあります。
また、頂点ごとに違う値を設定することができます。
attributeというキーワードで定義
頂点データ(属性)は、attributeというキーワードで定義します。
vec3は型の情報
vec3は、3つの要素を持つ変数(3次元のベクトルを持つ)として定義しています。
クリップ座標(クリップ領域)
WebGLの学習をすすめると、クリップ座標(クリップ領域、Clip Coordinates)という言葉を聞くようになります。
WebGLでブラウザに(canvas要素に)映し出される座標、領域のことです。
x軸、y軸、z軸それぞれを-1から1の範囲で指定します。
-1から1の範囲を超える値を指定した場合、たとえば2と指定すると、画面からその頂点は見えなくなりますが、-1から1の範囲は見える状態になります。
頂点位置決定後にフラグメントシェーダが実行
頂点位置決定後に、その後の処理であるフラグメントシェーダが実行されます。
フラグメントシェーダについては、フラグメントシェーダとはを参考にしてみてください。
まとめ
- 頂点シェーダー(vertexShader、バーテックスシェーダー)とは、物体の頂点の位置を決定するためのプログラムのこと
- gl_Positionに渡した値が頂点の位置
- 頂点ごとに頂点データ(attribute,頂点属性)を渡すことができる
- 頂点データは、頂点ごとに違う値に設定できる
- 頂点データは、ユーザーが定義できる
- 頂点位置決定後にフラグメントシェーダが実行される