WEBGL / OPENGLES - Как объединить несколько рендеров в одном? - PullRequest
3 голосов
/ 11 января 2012

вот моя проблема:

Я хочу разделить холст на 4 виртуальных квадранта и на каждый квадрант, который хочу визуализировать одну и ту же сцену разными цветами (с разными фрагментными шейдерами), чтобы сравнить некоторые эффекты в реальном времени. Я не уверен, как это сделать. Должен ли я рендерить одну и ту же сцену 4 раза в 4 различных текстурах, а затем повторно заполнить 4 прямоугольника этими текстурами? Или я должен сделать другой fshader и вручную заполнить все фрагменты этими текстурами? Есть ли возможность использовать буферные объекты рендеринга для повышения производительности?

Заранее спасибо,

1 Ответ

7 голосов
/ 12 января 2012

Для этого вам не нужно рендерить текстуру (хотя это один из способов). На самом деле это можно сделать намного проще с помощью gl.viewport.

gl.viewport просто устанавливает прямоугольник на холсте, который вы хотите визуализировать. Все, что выпадает за пределы этого прямоугольника, обрезается. Обычно вы устанавливаете тот же размер, что и холст, потому что хотите рендерить полноэкранный режим, но в вашем случае вы можете сделать следующее:

// Clears the entire scene. gl.clear does not respect the viewport
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

// Render upper left quadrant
gl.viewport(0, 0, canvas.width/2, canvas.height/2);
drawSceneWithShader(shader[0]);

// Render upper right quadrant
gl.viewport(canvas.width/2, 0, canvas.width/2, canvas.height/2);
drawSceneWithShader(shader[1]);

// Render lower left quadrant
gl.viewport(0, canvas.height/2, canvas.width/2, canvas.height/2);
drawSceneWithShader(shader[2]);

// Render lower right quadrant
gl.viewport(canvas.width/2, canvas.height/2, canvas.width/2, canvas.height/2);
drawSceneWithShader(shader[3]);

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

...