Webgl:设备似乎报告了不正确的gl.MAX\U纹理\U大小值

Webgl:设备似乎报告了不正确的gl.MAX\U纹理\U大小值,webgl,Webgl,我正在处理一个涉及大纹理的webgl场景。我一直在查询以确定给定设备支持的最大纹理大小,如下所示: var gl = document.createElement('canvas').getContext('webgl') console.log(gl.getParameter(gl.MAX_TEXTURE_SIZE)) 在我的2015 Macbook Pro上,我可以使用返回大小的纹理。然而,在2015 MacBook Air上,当我尝试将返回大小的纹理作为统一纹理传递给着色器时,我得到一个

我正在处理一个涉及大纹理的webgl场景。我一直在查询以确定给定设备支持的最大纹理大小,如下所示:

var gl = document.createElement('canvas').getContext('webgl')
console.log(gl.getParameter(gl.MAX_TEXTURE_SIZE))
在我的2015 Macbook Pro上,我可以使用返回大小的纹理。然而,在2015 MacBook Air上,当我尝试将返回大小的纹理作为统一纹理传递给着色器时,我得到一个错误:

[.WebGL-0x7fcb4489200]GL错误:GL\u无效\u帧缓冲区\u操作:

glGenerateMipmap发布一些代码!无法保证您可以分配最大大小的纹理,因为系统可能内存不足

最大纹理大小为x 1或1 x最大纹理大小的纹理可能不会耗尽内存。最大纹理大小x最大纹理大小最大纹理大小当最大纹理大小为2^14时,如果它是RGBA/无符号字节,则需要最小1gig的vram。有了mips,它将是1.4gig的vram。除此之外,浏览器可能会分配1.4gig的vram来尝试清除纹理,而驱动程序本身可能会分配1.4gig的ram来备份纹理或准备将其上载到GPU或两者。有很多机会耗尽内存。如果是RGBA/FLOAT纹理,则需要5.6gig

这是一个分配最大x 1的测试

const gl=document.createElement('canvas').getContext('webgl');
常量maxTextureSize=gl.getParameter(gl.MAX\u纹理大小);
常量maxRenderbufferSize=gl.getParameter(gl.MAX\u renderBufferSize);
log('max texture size:',maxTextureSize);
log('max renderbuffer size:',max renderbuffersize);
常量tex=gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D,tex);
gl.texImage2D(
gl.U 2D,
0,
gl.RGBA,
maxTextureSize,
1.
0,
gl.RGBA,
gl.UNSIGNED_字节,
无效);
gl.GenerateMap(gl.TEXTURE_2D);
console.log('GL ERROR:',glEnumToString(GL,GL.getError());
函数glEnumToString(总帐,值){
常量键=[];
用于(总帐中的常量键){
if(总帐[键]==值){
按键。按(键);
}
}
return keys.length?keys.join(“|”):`0x${value.toString(16)}`;

}
在黑暗中拍摄:据报道最大尺寸是2倍吗?@TheJim01感谢您的回复!报告的最大纹理大小为2**14。你能告诉我是什么让你有这种预感,或者如果最大纹理大小不是二的幂,它可能意味着什么吗?预感是它报告的数字是“从1开始”的值,而不是“从零开始”。这意味着你能发送的最大值实际上是
gl.max\u texture\u size-1
。但既然你排除了这一点,发送
gl.MAX\u TEXTURE\u SIZE-1 x gl.MAX\u TEXTURE\u SIZE-1
TEXTURE只会导致“二的力量”警告。啊,谢谢@TheJim01的后续报道,有意义……谢谢@gman!你教会了我很多。很抱歉没有纹理代码——我的纹理组成方式需要相当多的阶段设置,我希望这个问题与我完全忽略的东西有关(例如RAM的限制),而不是错误报告的值。快速跟进:有没有办法查询可用RAM的总量和分配数量?不幸的是,我没有办法查询RAM或gpu内存。我有一种强烈的预感,你是对的。我希望我能核实一下……看到了吗