Для создания выходной текстуры мне нужен вызов texImage2D? - PullRequest
0 голосов
/ 28 августа 2018

В Webgl я в настоящее время делаю следующие вызовы для создания текстуры, используется ли она для ввода или для вывода. Мне действительно нужен вызов texImage2D, зная, что мой шейдер будет перезаписывать значения в текстуре?

const texture = gl.createTexture();
// Bind the texture so the following methods effect this texture.
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

gl.texImage2D(
    gl.TEXTURE_2D,
    0,  // Level of detail.
    this.encoder.internalFormat, width, height,
    0,  // Always 0 in OpenGL ES.
    this.encoder.format, this.encoder.channelType, null);
this.checkError();
gl.bindTexture(gl.TEXTURE_2D, null);
return texture as WebGLTexture;

1 Ответ

0 голосов
/ 29 августа 2018

Вот полный пример кода, который создаст текстуру, равную размеру холста (это можно использовать для рендеринга за пределами экрана)

const gl = canvas.getContext('webgl');
const fb = gl.createFramebuffer();

const texture = gl.createTexture();

gl.bindTexture(gl.TEXTURE_2D, texture);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.canvas.width, gl.canvas.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);

gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);

Позже вы можете использовать визуализированную текстуру или прочитать ее содержимое с помощью gl.readPixels

...