2016-08-09 3 views
2

OpenGL ES 3とは異なり、gl.mapBufferRangegl.bufferSubData(それが存在する)を除いて、WebGL 2の均一なバッファデータを効率的に更新する方法はありますか?あなたがバッファを作成するように、それは、パラレルtypedArrayを作成すると思われるので、例えば、PerDraw制服ブロックWebGL 2のユニフォームバッファデータの更新?

uniform PerDraw 
{ 
    mat4 P; 
    mat4 MV; 
    mat3 MNormal; 
} u_perDraw; 
+0

'gl.bufferSubData'が存在します – gman

+0

ああ私の悪いです。すでにWebGL 1に入っているので、WebGL 2の仕様では見つからなかったのです。 – shrekshao

答えて

1

gl.bufferSubDataが存在する 。 typedArrayを更新し、 gl.bufferSubDataを呼び出してバッファにコピーして更新を行い、gl.bindBufferRangeを使用します。

これはまだです。おそらくはまだ非常に高速です。まず、すべての値操作をJavaScriptに入れておくと、WebGLを呼び出すオーバーヘッドが少なくなります。あなたが更新する10件のユニフォームを持っている場合、それはあなたが

を行うことができます上記の例では、あなたの均一なブロックを与えられたので、私は、単一の型指定された配列にすべてのユニフォームのためのArrayBufferViewsを生成 TWGL.jsで10

するのではなく、WebGLのに2つの通話を発信していることを意味します

ubo.MV[12] = tx; 
ubo.MV[13] = ty; 
ubo.MV[14] = tz; 

それとも、あなたが

var dest = ubo.P; 
m4.perspective(fov, aspect, zNear, zFar, dest); 

私が持っている問題の一つは、均一な最適化を扱っているようなものを行うことができます先のパラメータとして配列/ typedarrayをとる数学ライブラリを持っている場合は、別の例として 。シェーダを編集すると、デバッグ中で、フラグメントシェーダの上部にoutput = vec4(1,0,0,1); return;を挿入するだけで、コードが最適化され、コードが破損する可能性があります。私はC/C++プロジェクトでこれを扱う標準的な方法が何であるか分かりません。私はC++で構造を宣言すると思います。

struct PerDraw { 
    float P[16]; 
    float MV[16]; 
    float MNormal[9]; 
} 

したがって、問題の種類はなくなります。 twgl.jsでは、実行時に構造体を効果的に生成しています。つまり、コードが存在すると予想してもコードブレイクから最適化されているため生成されません。

twglでは、JavaScriptオブジェクトから型付き配列にコピーする関数を作成しました。最適化された均一ブロックをスキップして、残念ながらオーバーヘッドを追加できます。 typearrayビューを直接変更したり、デバッグ時に破損を処理したり、構造化コピー機能(twgl.setBlockUniforms)を使用することは自由です。

多分JavaScriptからtwglの構造体を指定して生成させ、それを生成して均一ブロックオブジェクトにマッチさせるのはあなた次第です。これはC++に似たものになり、1つのコピーを削除し、デバッグの最適化によってブロックが削除されたときに対処しやすくなります。

関連する問題