【问题标题】:Why am I getting an error from texSubImage3D when loading data from an image从图像加载数据时,为什么我从 texSubImage3D 收到错误
【发布时间】:2018-07-02 11:09:12
【问题描述】:

我有一个尺寸为 128x32128(相当于 251 128x128 层)的 PNG 文件,当我尝试以下操作时:

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 的参数。

浏览器:Windows 7 x64 上的 Chrome v67

【问题讨论】:

  • gl.getParameter(gl.MAX_TEXTURE_SIZE) 返回什么?
  • 你试过火狐吗?
  • @Asaq 最大纹理大小为 16,384,但我请求的纹理为 128x128x251...

标签: javascript webgl webgl2


【解决方案1】:

这似乎是 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);
}

Filed a bug

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    相关资源
    最近更新 更多