Error: WebGL: texImage2D: Provided buffer is too small. (needs 2663999, has 2662800)
您调用了gl.texImage2D,但纹理的尺寸大于您提供的数据。
例如,如果你这样做了
var width = 16;
var height = 16;
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0,
gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(10));
你会得到同样的错误。您指定了一个纹理 16x16xRGBA(4)
表示数据必须是 16*16*4 或 1024 字节,但上面的代码只传递了 10 个字节
需要注意的一点是UNPACK_ALIGNMENT 设置。默认为 4
这意味着每行数据将被填充到 4 个字节。换句话说,7x3 的 alpha 纹理将是
width = 7
height = 3
bytesPerPixel = 1 // gl.ALPHA
unpaddedRowSize = width * bytesPerPixel
paddedRowSize = Math.floor((minBytesPerRow + 3) / 4) * 4; // = 8
requiredDataSize = (height - 1 * paddedRowSize) + unpaddedRowSize
您可能认为 ALPHA 只需要 7x3 或 21 个字节,但实际上您需要 8+8+7 或 23 个字节,因为除最后一行之外的每一行都填充为 4 的倍数
您可以通过调用告诉 WebGL 将 UNPACK_ALIGNMENT 设置为 1
gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
现在它只需要 21 个字节,因为它不再填充行。
Error: WebGL: generateMipmap: The base level of the texture does not have power-of-two dimensions
WebGL 1.0 不能使用 mips,除非纹理在两个维度上都是 2 的幂。您的示例纹理在任一维度上都不是 2 的幂,因此您不能使用 mips,也不能为它们调用 gl.generateMipmap。
相反,您必须将纹理过滤设置为仅使用顶级(0 级)mip
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); // or gl.NEAREST
并且你必须将包装设置为CLAMP_TO_EDGE
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);
WebGL 2.0 消除了这些限制