0

JavaScriptフレーバーでProcessing.jsを作成すると、Processing.jsを使用してProcessing-Codeを解析したときに表示されなかったパフォーマンス警告が表示されます。私はそれに入るために3Dサポートを備えたかなり単純なスケッチを作成しました、そしてコンソールはこの警告で溢れています:

パフォーマンス警告:属性0は無効になっています。これには重大なパフォーマンスの低下があります

どういう意味ですか?そしてさらに重要なのは、それをどのように修正するかということです。

それがスケッチです。(codepen.ioで視聴/編集

var can = document.createElement("canvas");
var sketch = function(p){

  p.setup = function(){
    p.size(800, 600, p.OPENGL);
    p.fill(170);
  };

  p.draw = function(){
    p.pushMatrix();
    p.translate(p.width/2, p.height/2);
    p.box(50);
    p.popMatrix();
  };
};

document.body.appendChild(can);
new Processing(can, sketch);
4

1 に答える 1

3

これは Processing.js の問題です

詳細な説明: OpenGL と OpenGL ES には属性があります。すべての属性は、バッファから値をフェッチするか、定数値を提供できます。ただし、OpenGL では属性 0 は特別です。定数値を提供することはできません。バッファから値を取得する必要があります。ただし、WebGL は、この制限がない OpenGL ES 2.0 に基づいています。

そのため、WebGL が OpenGL の上で実行されていて、ユーザーが属性 0 を使用しない (定数値を使用するように設定されている) 場合、WebGL は一時バッファーを作成し、定数値で埋めて、OpenGL に渡す必要があります。これは遅いです。したがって、警告。

Processing の問題は、複数のユース ケースを処理する単一のシェーダーがあることです。法線、位置、色、テクスチャ座標の属性があります。Processing に描画を依頼する内容によっては、これらの属性のすべてが使用されない場合があります。たとえば、通常は法線を使用しない場合があります。法線はライトをサポートする処理でのみ必要なので、ライトがない場合は法線はありません (私は推測しています)。その場合、法線をオフにします。残念ながら、法線がたまたま属性 0 にある場合、WebGL がレンダリングするためには、一時バッファを作成し、定数値で満たしてからレンダリングする必要があります。

これを回避するには、常にアトリビュート 0 を使用します。Processing の場合、常に位置データを使用します。したがって、シェーダーをリンクする前に呼び出す必要がありますbindAttribLocation

// "aVertex" is the name of the attribute used for position data in
// Processing.js
gl.bindAttribLocation(program, 0, "aVertex");

これにより、属性「aVertex」は常に属性 0 を使用し、すべてのユース ケースで常に「aVertex」を使用するため、その警告が表示されることはありません。

理想的には、常に場所をバインドする必要があります。そうすれば、リンク後にクエリを実行する必要がなくなります。

于 2013-02-21T01:49:32.110 に答える