Почему я получаю ошибку от texSubImage3D при загрузке данных из изображения - PullRequest
0 голосов
/ 01 июля 2018

У меня есть файл PNG с размерами 128x32128 (что эквивалентно 251 слою 128x128) и при попытке выполнить следующее:

gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.SRGB8_ALPHA8, 128, 128, 251)
gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, 128, 128, 251, gl.RGBA, gl.UNSIGNED_BYTE, imageElement)
// imageElement.src = 128x32128.png

Я получаю сообщение об ошибке браузера WebGL: INVALID_VALUE: texSubImage3D: width, height or depth out of range

Однако, если я попробую что-то очень похожее с другим изображением размером 128x8192 (эквивалентно 64 слоям 128x128), я не получу ошибку:

gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.SRGB8_ALPHA8, 128, 128, 32)
gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, 128, 128, 32, gl.RGBA, gl.UNSIGNED_BYTE, imageElement)
// imageElement.src = 128x8192.png

Однако , если я пытаюсь использовать тот же код с исходным изображением, я получаю ту же ошибку:

gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.SRGB8_ALPHA8, 128, 128, 32)
gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, 128, 128, 32, gl.RGBA, gl.UNSIGNED_BYTE, imageElement)
// imageElement.src = 128x32128.png

Это не имеет никакого смысла. Конечно, это ошибка реализации, поскольку из примера 2 в пример 3 изменилось только изображение, а не параметры texSubImage3D.

Браузер: Chrome v67 в Windows 7 x64

1 Ответ

0 голосов
/ 01 июля 2018

Это похоже на ошибку в Chrome, так как она работает в Firefox

const ctx = document.createElement('canvas').getContext("2d");
const gl = document.createElement('canvas').getContext("webgl2");

test(1);
test(128);
test(129);

function test(slices) {
  log('slices:', slices);
  
  const height = 128 * slices;
  
  ctx.canvas.width = 128;
  ctx.canvas.height = height;
  ctx.beginPath();
  ctx.moveTo(0, 0);
  ctx.lineTo(128, height);
  ctx.moveTo(128, height);
  ctx.lineTo(0, 128);
  ctx.stroke();
  //document.body.appendChild(ctx.canvas);

  const tex = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, tex);
  log("gl error:", gl.getError());
  gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 128, 128, slices);
  log("gl error:", gl.getError());

  gl.texSubImage3D(
     gl.TEXTURE_2D_ARRAY, // GLenum target, 
     0, // GLint level, 
     0, // GLint xoffset, 
     0, // GLint yoffset, 
     0, // GLint zoffset,
     128, // GLsizei width, 
     128, // GLsizei height, 
     slices, // GLsizei depth, 
     gl.RGBA, // GLenum format, 
     gl.UNSIGNED_BYTE, // GLenum type,
     ctx.canvas); // TexImageSource source

  log("gl error:", gl.getError());
  log('.');
}

function log(...args) {
  const div = document.createElement('div');
  div.textContent = [...args].join(' ');
  document.body.appendChild(div);
}

Подана ошибка

...