2016-10-17 9 views
2

Я хочу сделать большую сцену (смоделированный город) с помощью WebGL, и я думаю, что occlusion culling - хороший способ оптимизировать производительность.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

Таким образом, у вас есть * one * draw draw drawing * two * triangles, где один покрыт другим, и попросите 'ANY_SAMPLES_PASSED', который дает вам' '' '' '' '' '' '' (https: //www.khronos .org/opengles/sdk/docs/man3/html/glBeginQuery.xhtml), как и все ваши первые образцы треугольников, которые легко удовлетворяют «любой выборке». –

ответ

2

Запросы на окклюзию и отбраковка окклюзии - это не одно и то же.

Отбор основного объекта может выполняться (и должен быть) полностью на ЦПУ (например, проверки на уклонение на объектных ограничивающих блоках, видимость портала, октетов и т. Д.) Гораздо эффективнее, чем на графическом процессоре, поскольку приложение может использовать знания уровня сцены у графического драйвера просто нет.

При окклюзии GPU отбраковка легче всего обеспечивается путем рендеринга непрозрачных объектов с использованием предпродажного порядка визуализации (опять же, игровой движок обычно грубо сортирует партии объектов) и с использованием теста глубины, чтобы отбросить скрытые объекты.

Запросы на окклюзию - очень специализированный инструмент, который полезен для небольшого количества визуальных эффектов (например, вспышки объектива), но слишком сложно конвейер для любого агрессивного отбраковки в пределах одного кадра.

+1

Чтобы добавить к ответу isogen74 сверху на отладку на основе процессора, используя хорошо продуманную структуру данных для вашего PVS (потенциально видимый набор), необходимо для больших сцен. В качестве простого примера разделите мир на 1x1 км области и решите, что вы можете видеть только 5 км. Затем используйте усечку, чтобы выяснить, какие куски 1x1k действительно отображаются. Только попытайтесь нарисовать эти вещи. Это просто один простой пример. Существуют бесконечные способы разработки PVSes. Порталы - еще один для внутренних сцен. – gman