为什么我在从图像加载数据时从 texSubImage3D 收到错误
Why am I getting an error from texSubImage3D when loading data from an image
我有一个尺寸为 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 的参数。
浏览器:Chrome v67 on Windows 7 x64
这似乎是 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);
}
我有一个尺寸为 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 的参数。
浏览器:Chrome v67 on Windows 7 x64
这似乎是 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);
}