WEBGL/OPENGLES - Как объединить несколько рендеров в один?

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

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

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


person JoniPichoni    schedule 11.01.2012    source источник


Ответы (1)


Для этого вам не нужен рендер в текстуру (хотя это один из способов). На самом деле это можно сделать намного проще с помощью 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]);

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

person Toji    schedule 11.01.2012