WebGL-INVALID_OPERATION:texImage2D:ArrayBufferView不够大,无法满足请求
WebGL - INVALID_OPERATION: texImage2D: ArrayBufferView not big enough for request
我目前正在按照本指南将场景渲染为纹理以生成深度/阴影贴图: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错误。
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- C++.SevenZip压缩为zip格式.ClassFactory无法提供请求的类
- 节点.js HTTP 无法通过套接字接收来自C++客户端的请求
- 无法在 XmlHttpRequest 模块上获取断点(Javascript 引擎/XHR 请求)
- 无法找到请求的 Boost 库boost_lboost_thread
- Winsock2.h 无法发送 http 请求
- Luci 无法启动请求的 CGI 程序:/www/cgi-bin/sample.cgi:执行错误
- C 为什么在满足布尔条件后,我的DO-while循环就无法结束
- 无法在谷歌测试中捕获调试断言(死亡测试不满足它)
- 错误请求,您的浏览器发送了此服务器无法理解的请求 - Qt Websocket 服务器
- WebGL-INVALID_OPERATION:texImage2D:ArrayBufferView不够大,无法满足请求
- 无法构建以下请求的语言:C (Linux,GCC)
- 在Raspberry Pi 3:E上建造QT:无法满足Libqt5Gui5的构建依赖性
- 如果条件但功能仍然返回某些内容,则无法满足
- 使用 select() 的请求/回复服务器。无法写回客户端
- 无法通过CPP-Netlib发送发布请求
- 如果语句在满足条件C++仍无法解决
- 为什么 boost::asio::async_read 无法读取请求的字节数
- 无法找到请求的 Boost 库 Windows Cmake
- 如何解决"无法分配请求的地址?