2016-10-17 4 views
2

WebGLを使用して大きなシーン(モデル化された都市)をレンダリングしたいと思います。オクルージョンカリングは、パフォーマンスを最適化するのに良い方法です。WebGL 2.0 Occlusion Query

WebGL 2.0には、オクルージョン情報を取得するための「クエリオブジェクト」という新機能があります。しかし、私がgl.getQueryParameter(クエリ、gl.QUERY_RESULT)を使用するたびに、私は同じ結果を得ました。

そして、私はこの問題を説明するために、ここでデモを書いた:

var query = gl.createQuery(); 
    gl.beginQuery(gl.ANY_SAMPLES_PASSED, query); 
    gl.drawArrays(gl.TRIANGLES,0,n); 
    gl.endQuery(gl.ANY_SAMPLES_PASSED); 

    var tick = function(){ 
     if(!gl.getQueryParameter(query,gl.QUERY_RESULT_AVAILABLE)){ 
      requestAnimationFrame(tick); 
      return; 
     } 
     var result = gl.getQueryParameter(query,gl.QUERY_RESULT); 
     console.log(Number(result)); 
     gl.deleteQuery(query); 
    }; 

    tick(); 

、ここではsceond三角形は最初の三角形によって覆い隠されているというのが私の頂点情報です。

var vertexData = new Float32Array([ 
      0.0,0.5,0.0,  //first triangle 
      -0.5,-0.5,0.0, 
      0.5,-0.5,0.0, 

      0.0,0.5,-0.5,  //second triangle 
      -0.5,-0.5,-0.5, 
      0.5,-0.5,-0.5 
    ]); 

、結果は結果何常に1

では、 '1' の略?

さらに、WebGL 2.0を使用してどのようにオクルージョンカリングを行うことができますか?役に立つサンプルはありますか?

+0

だから、あなたが他の人に覆われている* 1 *描画図面* 2 *三角形を持って、あなたに '' 1'' ''と似ている ''を与える '' ANY_SAMPLES_PASSED'(https://www.khronos .org/opengles/sdk/docs/man3/html/glBeginQuery.xhtml)のように、すべての最初の三角形サンプルを渡します。 –

答えて

2

オクルージョンクエリとオクルージョンカリングは同じものではありません。

基本的なオブジェクトのカリングは、アプリケーションがシーンレベルの知識を利用することができるため、GPUよりもはるかに効果的にCPU上で完全に実行できます(そして、オブジェクトバウンディングボックス、ポータルの可視性、オクトリーなどの錐台チェックなど)グラフィックスドライバは持っていません。

GPUオクルージョンでは、前面から背面へのレンダリング順序を使用して不透明なオブジェクトをレンダリングすることで最も簡単に行うことができます(通常、ゲームエンジンはオブジェクトバッチを厳密にソートします)。

オクルージョンクエリは、少数のビジュアルエフェクト(レンズフレアなど)には便利な非常に特殊なツールですが、1つのフレーム内での積極的なカリングについてはパイプライン処理が非常に難しいです。

+1

あなたのPVS(潜在的に目に見えるセット)のためのうまく設計されたデータ構造を使用して、CPUベースのカリングの上にあるisogen74の答えに加えることは、大きなシーンにとって必須です。簡単な例として、世界を1x1kmの地域に分け、5kmしか見ることができないと決めます。次に、錐台を使用して、どの1x1kチャンクが実際に表示されているか把握します。それらのものを描こうとするだけです。これは単なる1つの例です。 PVSを設計する無限の方法があります。ポータルは屋内の場面のもう一つです。 – gman