Open2
C-WebGL: attribute、varyingのリンク
ESSL1シェーダのリンカを実装していく。uniformは宣言をマージしてオフセットを決定するだけなので難しそうな attribute
と varying
から。。
レジスタ
WebGL1が採用しているOpenGL ES2の抽象化では、シェーダは 32bitx4 を1単位とするレジスタを使ってパラメタの入力ができ、それが頂点シェーダでは attribute
、フラグメントシェーダでは varying
で宣言される。
アトリビュートの用語はGPUによってはフラグメントシェーダのパラメタに使われることもあってまぎらわしいので、今回の処理系では 頂点シェーダとフラグメントシェーダの変数宣言をマージ して、 事前に以下の4種類に分類しておく ことにした。
-
input
。頂点シェーダの入力。 -
varying
。フラグメントシェーダの入力。頂点シェーダの出力や FragCoordのようなGPU側で補間されるデータ。 -
output
。フラグメントシェーダの出力。 -
unused
。頂点シェーダで宣言されているものの、フラグメントシェーダで使用していないものでbuilt-in以外。
リンク処理は、必要に応じて分類されたこれらの変数に適切な location
をアサインする処理ということになる。特に、頂点シェーダとフラグメントシェーダで共通する varying
には同じ番号の location
をアサインしてやる必要がある。
location
の占有サイズ
Vulkanでは、シェーダの入力には location
を振る必要がある。このlocationは 基本的に1変数で1消費し、 mat2
では 2 、 mat3
では 3 、 mat4
では 4消費する ...はずなんだけど仕様書で正確な言及箇所がわからなかった。locationの消費順は GLES2 仕様書の 2.10.4 Shader Variables に記述がある。常識的に考えてアラインメントは要らないはず。