Open2

C-WebGL: attribute、varyingのリンク

okuokuokuoku

ESSL1シェーダのリンカを実装していく。uniformは宣言をマージしてオフセットを決定するだけなので難しそうな attributevarying から。。

レジスタ

WebGL1が採用しているOpenGL ES2の抽象化では、シェーダは 32bitx4 を1単位とするレジスタを使ってパラメタの入力ができ、それが頂点シェーダでは attribute 、フラグメントシェーダでは varying で宣言される。

アトリビュートの用語はGPUによってはフラグメントシェーダのパラメタに使われることもあってまぎらわしいので、今回の処理系では 頂点シェーダとフラグメントシェーダの変数宣言をマージ して、 事前に以下の4種類に分類しておく ことにした。

  1. input 。頂点シェーダの入力。
  2. varying 。フラグメントシェーダの入力。頂点シェーダの出力や FragCoordのようなGPU側で補間されるデータ。
  3. output 。フラグメントシェーダの出力。
  4. unused 。頂点シェーダで宣言されているものの、フラグメントシェーダで使用していないものでbuilt-in以外。

リンク処理は、必要に応じて分類されたこれらの変数に適切な location をアサインする処理ということになる。特に、頂点シェーダとフラグメントシェーダで共通する varying には同じ番号の location をアサインしてやる必要がある。