Для рендеринга из одной текстуры в другую требуется прикрепить текстуру, в которую вы хотите записать (целевую текстуру), к кадровому буферу
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb):
const attachmentPoint = gl.COLOR_ATTACHMENT0;
const textureType = gl.TEXTURE_2D;
const mipLevel = 0; // must be 0 on WebGL1
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint,
textureType, someTexture, mipLevel);
После этого для рендеринга в текстуру используйте
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.viewport(0, 0, widthOfTexture, heightOfTexture);
Чтобы снова выполнить рендеринг на холст, используйте
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
См. https://webglfundamentals.org/webgl/lessons/webgl-render-to-texture.html
Обратите внимание, что в WebGL1 гарантированно будет работать только 1 формат текстур.internalFormat = gl.RGBA, формат = gl.RGBA, тип = gl.UNSIGNED_BYTE.В WebGL2 есть таблица.См. Стр. 5 справочного руководства
В противном случае нет никакой разницы между рендерингом на холст и рендерингом для текстуры.Точно так же, как вы рендерили бы что-то в определенное место на холсте, точно так же, как вы рендерили бы в определенное место на текстуре.Вы настраиваете геометрию, атрибуты, униформу, выполняете любую необходимую математику в зависимости от размера того, что вы рисуете, и рисуете.Если вы не знаете, как это сделать , в этой статье показан код, который отображает прямоугольник . В этой статье показано, как визуализировать что-либо в любой позиции . В этой статье показано, как использовать матрицы для большей гибкости .
Визуализация исходной текстуры ничем не отличается от визуализации некоторых текстурированных треугольников / геометрии / и т. Д. На холсте.Вы объявляете единый сэмплер в своем шейдере, привязываете текстуру к текстурному блоку и рисуете. В этой статье показано, как использовать текстуры .
Эта статья объединяет все эти уроки, чтобы нарисовать текстурированный квад в любом месте, используя любую часть текстуры .