WebGL 上的错误"Tex image TEXTURE_2D level 0 is incurring lazy initialization"



我收到错误消息:Error: WebGL warning: drawElements: Tex image TEXTURE_2D level 0 is incurring lazy initialization.WebGL上,我想知道实际含义。

无论如何,延迟初始化在单线程应用程序中甚至是一个问题吗?我理解为当您在 getter 中初始化变量时?

我尝试查找我的错误消息,但没有真正找到任何好的信息。

这是我处理纹理的代码:

const images = await Promise.all(model.maps.map(map => new Promise((resolve, reject) => {
const image = new Image();
image.src = map;
image.onload = event => {
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, image.width, image.height, 0, gl.RGBA, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
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);
gl.bindTexture(gl.TEXTURE_2D, null);
resolve(texture);
};
image.onerror = error => {
console.log(error);
resolve(null);
};
})));

我的绘制函数的相关部分基本上是:

gl.bindTexture(gl.TEXTURE_2D, textures[material.textureIndex]);
gl.activeTexture(gl.TEXTURE0);
gl.drawElements(gl.TRIANGLES, material.faceCount * 3, gl.UNSIGNED_SHORT, drawnCount);

话虽如此,如果我使用 6 参数语法:gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.FLOAT, image);,则此错误消息不再显示,我设法正确呈现。

> 这不是错误。这是一个警告。

错误: WebGL警告...

它前面说"错误"非常令人困惑,但即使它只说"警告",我也争论了很长时间,这是不好的警告。

警告是WebGL需要做一些不平凡的工作。

当你制作一个纹理并且你没有传递给它任何数据时,你null作为最后一个参数传递给texImage2D,这意味着在某些时候WebGL必须清除纹理。假设纹理为 2048x2048 RGBA/UNSIGNED_BYTE。实际上,WebGL必须分配16meg的ram(2048x2048x4(,将16meg的ram清除为0,并调用gl.texSubImage2D在实际使用纹理之前在纹理中放置零。如果他们不这样做,纹理中就会有随机数据,可能是秘密的数据、密码、以前的图形内存(如照片(或其他什么。

所以,警告告诉你发生了一些不平凡的工作。

此警告的问题在于停止警告的解决方法比警告本身更糟糕。解决方法是您自己清除纹理。为此,您需要在 JavaScript 中分配 16meg,就像在new Uint8Array(2048 * 2048 * 4)中一样。这意味着 JavaScript 正在分配 16meg,它也清除了 16 meg。它还分配了一个Uint8Array对象来跟踪该 16meg。该Uint8Array对象是一个复杂的 JavaScript 对象,可能是合成在一起的多个对象的集合,例如还分配了一个ArrayBuffer对象。这些对象都具有原型链,并且能够添加属性和方法以及getter和setter。还必须跟踪Uint8ArrayArrayBuffer,以便以后可以对其进行垃圾回收,这意味着它们甚至存在开销。更糟糕的是,如果浏览器是多进程的,而Chrome是,我相信Firefox正在努力,那么JavaScript中分配的16meg必须复制到GPU进程,这意味着首先GPU进程也需要分配16meg的ram,数据必须从运行网页的进程复制到GPU进程,以便可以传递给图形驱动程序。甚至更多的工作。

因此,换句话说,让 Firefox 对其警告闭嘴实际上会使您的代码速度慢得多,并且使用更多的内存,而不是 Firefox 只是默默地自行清除纹理。因此,为什么我说警告不应该存在

Firefox的开发人员有这样的观点:每当WebGL做一些繁重的事情时,他们都想给你一个警告。鉴于治愈会使您的代码更重,我不同意他们的 POV。Chrome 不会发出此警告。这也让开发人员感到困惑,因为他们认为自己做错了什么。他们没有做错任何事。

https://bugzilla.mozilla.org/show_bug.cgi?id=1478216

至于不渲染的东西,在你发布的代码中,你没有在纹理中放置任何东西,所以纹理当然是 0,0,0,0。

相关内容

最新更新