WebGL-INVALID_OPERATION:texImage2D:ArrayBufferView不够大,无法满足请求

WebGL - INVALID_OPERATION: texImage2D: ArrayBufferView not big enough for request

本文关键字:无法满足 请求 不够 ArrayBufferView OPERATION texImage2D WebGL-INVALID      更新时间:2023-10-16

我目前正在按照本指南将场景渲染为纹理以生成深度/阴影贴图:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/

指南是用C++编写的。我正在把它转换成WebGL-JavaScript,到目前为止已经成功了,但不幸的是在Chrome中遇到了这个错误:

WebGL: INVALID_OPERATION: texImage2D: ArrayBufferView not big enough for request

这是一个与有关的错误

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 1024, 768, 0, gl.RGB, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));

当1024到768的宽度和高度设置为1时,不会产生错误。

在指南中,它使用以下内容:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

对于类似的问题,这里有一个很好的答案:在WebGL中使用RGB格式创建纹理时出错,这让我相信,由于在调用该方法时纹理不存在,它不能大于1像素,但我不确定这是否正确编辑:由于两个原因,不重复此问题。1,如果它是重复的,我不会问这个问题;2,答案解释了为什么它不是重复的。

我将在下面转储指南中转换后的其余代码:

// shadow test
this.frameBuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer);
this.texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 1024, 768, 0, gl.RGB, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
this.depthBuffer = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthBuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 1024, 768);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depthBuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);
gl.drawBuffers([gl.NONE, gl.COLOR_ATTACHMENT0_EXT]);
gl.bindFramebuffer(gl.FRAMEBUFFER, this.buffer);
gl.viewport(0, 0, 1024, 768);

我已经用C++和OpenGL标记了这一点,以帮助理解WebGL-JavaScript和OpenGL-C++之间的这种方法的差异。

您得到的错误与解压缩对齐无关,而是您无法仅用4个字节填充1024x768纹理。texImage2D要求您提供null(在这种情况下,纹理大小的缓冲区被初始化、零填充并用于初始化纹理)或纹理大小的缓冲器,在您的情况下,它将是1024 * 768 * 3字节,恰好是4的倍数(因此您不会遇到任何拆包问题)。

以下是WebGL 1规范的相关摘录:

如果像素为null,则传递一个初始化为0的足够大小的缓冲区。[…]如果像素不是null,但其大小小于指定的宽度、高度、格式、类型和像素存储参数所需的大小,则会生成INVALID_OPERATION错误。