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的阿尔法纹理将成为
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的调用
gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
设置UNPACK_ALIGNMENT 1现在只需要21个字节,因为它不会再垫行。除非纹理是2在两个维度上的功率
Error: WebGL: generateMipmap: The base level of the texture does not have power-of-two dimensions
WebGL的1.0不能用MIPS。你的示例纹理在任何一个维度中都不是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消除这些限制
我尝试了你提供的所有建议,但遗憾的是没有任何工作,但如果我保存了alpha c通道到一个单独的画布,并尝试将该画布渲染为webgl中的纹理,它可以工作 –