前提・実現したいこと
WebGL初心者です.
WebGL2を用いてGPGPU...のようなことをしています.
処理するにあたって,ポリラインのスムーシングが必要になりました.
スムーシング処理について,ポリラインが座標値を表す3次元ベクトルのリスト(pl = [v0, v1, v2, ... vn], v = [x, y, z])で表されているとすると,処理後のポリラインの各点は
javascript
1pl[i] = [ 2 pl[i-1].x + pl[i].x + pl[i+1].x) / 3, 3 pl[i-1].y + pl[i].y + pl[i+1].y) / 3, 4 pl[i-1].z + pl[i].z + pl[i+1].z) / 3 5]
で計算でき,この処理を数回行うことで最終的なスムーシング処理後のポリラインを得ます.
これをglsl上で実現したいのですが,私の調べた限り,頂点シェーダ上で,隣の頂点にアクセスすることはできなさそうなので,
あらかじめ右と左にシフトしたポリライン,すなわち,
javascript
1shiftToL = [v1, v2, ... , vn, dummy] 2shiftToR = [dummy, v0, v1, ... ,vn-1]
このようなリストを頂点属性として登録しておき,
glsl
1#version 300 es 2 3layout (location = 0) in vec3 shiftToLPosition; 4layout (location = 1) in vec3 Position; 5layout (location = 2) in vec3 shiftToRPosition; 6 7out vec3 smoothed; 8 9void main(){ 10 smoothed = (shiftToLPosition + Position + shiftToRPosition) / 3.0; 11}
このように計算すればできそう,というところまではわかりました.(端は後処理でなんとかします.)
しかし,このshiftToLPositions
とshiftToRPositions
はPositions
とほとんど中身が同じです.
スムーシング処理の計算は複数回行われ,そのたびにほとんど同じデータx3をGPUに転送するのはもったいない気がします.
そこで,
javascript
1pl = [dummy, v1, v2, ... , vn, dummy]
このようなデータのみをGPU上にbufferに保存しておき,attributeに割り当てる時にbufferのoffsetみたいなものでずらして登録できればGPUに転送する量を減らせるのではないか,とおもいました.
調べた限り,gl.vertexAttribPointer
の第六引数のoffsetはそういう目的で使えるものではなく,単にgl.vertexAttribPointer
を使うだけでは無理そうなのですが,なんとか実現する方法はないでしょうか?
もしくは別の方法で同様な計算を実現できないでしょうか?
初心者なので的外れな質問かもしれませんが,どなたかご教示くださると幸いです.
あなたの回答
tips
プレビュー