home /
uni /
gl /
top
はじめの一歩
最低限のコードで動かす
- 絶対に必要なのは頂点シェーダーとフラグメントシェーダ
- ふたつのシェーダーに対して同じような処理をするので関数にしてある
- 頂点シェーダーは
gl_Positionを返す必要がある
- ポイント(点)を描画する場合は
gl_PointSizeも返す必要がある
- フラグメントシェーダーは
gl_FragColorを返す必要がある
- それさえ返していれば頂点バッファは必須ではなく、
drawArraysに頂点数だけ渡せばいい
- JSのスレッドが走る時に(0, 0, 0, 0)で塗り潰されるらしい
- その結果、キャンバスが透明になり、CSSの背景色が見えるようになる
- この例では背景色を指定しておらず、青い四角を書いているので、ブラウザの背景色を青にしている人は多分何も見えない
- スレッドが起動するたびに塗り潰されるので、ふたつ以上のスレッドに分けて描画しようとすると、先に描画したものが消えてしまう
- この辺の挙動は
getContextするときにオプションで変更できるらしい
- もでるびゅーぷろじぇくしょん? なにそれ?
見通しをよくする
- シェーダーソースをscript要素に追い出した
$IDはなんとなくjQueryぽいがidを指定すると要素を取ってくる
loadShaderは指定されたソースが文字列ではなかった場合、要素とみなしてその中身をソースにする
- ついでにシェーダータイプも文字列で指定できるようにする
- 背景もちゃんと塗りつぶす
$Dとかヒドいことしてるけど気にしない
パラメータの指定
- 頂点とポイントサイズをuniformで指定してみる
gl_Position.wは1固定
- ポイントサイズの小さい順に (1, 0) (-1, 0) (0, 1) (0, -1)なので、右端がX=+1、左端が-1、上端がY=+1、下端が-1
バッファと頂点属性
- バッファの確保、内容の設定、属性への割り当てが必要(めんどくさい)
enableVertexAttribArrayを呼び出すのを忘れがち
- 面倒くさいものは関数にしておこう
- バッファの確保時に頂点数を数えさせるため、頂点ひとつ分を配列にまとめ、その配列を
createFloatBufferに渡し、createFloatBuffer側でArray.flatで展開
- 戻り値として頂点数も返す
- 属性をふたつ、
setVertexAttribで一気に設定
getAttribLocationの値はプログラムをリンクすれば決まるので、linkProgram関数でリンク時に取得
- 頂点属性には
vertexAttrib4fvなどで固定値を割り当てることもできる
disableVertexAttribArrayを呼び出すのを忘れがち
- 属性の数によって呼び出す関数が違う
- 引数の要素数で関数の配列を引いているが、
thisが変わってしまうのでcallで呼び出す