WebGL 上出现错误“Tex 图像 TEXTURE_2D level 0 正在引发延迟初始化”

2023-12-29

我收到错误消息: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);然后这个错误消息不再显示,并且我设法正确渲染。


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

错误:WebGLwarning ...

这是非常令人困惑的,它在前面说“错误”,但即使它只说“警告”,我已经争论了很长时间,这是一个糟糕的警告。

警告是 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,它也会清除这 16meg。它还分配一个Uint8Array对象跟踪那 16meg。那Uint8Arrayobject 是一个复杂的 JavaScript 对象,可能是多个对象组合在一起的集合,例如ArrayBuffer对象也被分配。这些对象都有原型链,并且能够添加属性、方法以及 getter 和 setter。那Uint8Array and ArrayBuffer还必须进行跟踪,以便稍后可以对它们进行垃圾收集,这意味着即使它们存在,也会产生开销。更糟糕的是,如果浏览器是多进程的(Chrome 就是这样,我相信 Firefox 正在努力实现这一目标),那么 JavaScript 中分配的 16meg 必须复制到 GPU 进程,这意味着 GPU 进程首先也需要分配 16meg 的 RAM,数据必须从运行网页的进程复制到 GPU 进程,以便可以传递到图形驱动程序。甚至还有更多的工作。

换句话说,让 Firefox 关闭它的警告实际上会让你的代码比 Firefox 默默地自行清除纹理慢得多,并且使用更多的内存。因此为什么我说警告不应该存在

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

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

至于不渲染的东西,在您发布的代码中,您没有在纹理中放置任何内容,因此纹理当然是 0,0,0,0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebGL 上出现错误“Tex 图像 TEXTURE_2D level 0 正在引发延迟初始化” 的相关文章

  • JavaScript onTouch 不工作

    谁能告诉我为什么这个 onTouch 处理程序没有触发 var myDiv document getElementById existingContent var myButton a href log out a myDiv append
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • Android 设备上的 PhoneGap 蓝牙插件

    我一直在尝试让 PhoneGap 工作的蓝牙插件 但我似乎不知道哪里出了问题 首先 我的测试设备是 Galaxy S3 GT 19305T 应用程序是使用PhoneGap CLI http docs phonegap com en 3 0
  • 为什么 JavaScript base-36 转换看起来不明确

    我目前正在编写一段使用 Base 36 编码的 JavaScript 我遇到了这个问题 parseInt welcomeback 36 toString 36 看来要回归了 welcomebacg 我在 Chrome 开发者控制台和 Nod
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • 通过 CDN 使用 Dojo 时如何加载自定义 AMD 模块?

    我正在使用 google 的 CDN 并尝试使用他们的加载程序加载我自己的 AMD 模块 我知道我做错了什么 但我被困住了 有任何想法吗
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成

随机推荐

  • 配置中的属性占位符

    在 xml 上下文中使用 Spring 我们可以像这样简单地加载属性
  • r 中带有 Plot_ly 的 3D 表面,带有 x、y、z 坐标

    I am trying to use 3D surface plots to analyze the stability of outcomes as a function of inputs z is my outcome and x a
  • 如何从“带有时区的时间戳”列读取时区?

    我无法找到读取 PostgreSQL 类型列中时区值的方法带时区的时间戳 JDBC提供方法java sql ResultSet getTimestamp int java util Calendar 但我必须提供我自己的日历 我看不出有什么
  • 已弃用的 AudioManager.isWiredHeadsetOn 的替代方案?

    方法AudioManager isWiredHeadsetOn http developer android com reference android media AudioManager html isWiredHeadsetOn 28
  • 我已经成功安装了magento2但是有很多js错误

    我已经成功安装了magento2 但是有很多js错误 当通过 firebug 查看控制台日志时 它显示了很多错误 并且还有其他内容需要为 magento css 和 js 配置吗 尝试以下 使 bin magento 可执行 chmod x
  • sqlite3 - 如何使用 .databases 命令列出数据库名称?

    我是 Rails 和 SQLite 的新手 这是我的场景 我有sqlite3安装在我的 Windows Vista 计算机上 博客应用程序代码也已在以下位置实现 c rails blog 我调出命令提示符并直接进入c rails blog
  • ScrollView 内的 ForEach 不占用整个宽度

    我正在尝试使用 SwiftUI 重新创建当前应用程序的 UI 但这比我最初要困难得多 我想要实现类似卡片的单元格 背后有一些背景 我找到List至少目前还不支持这一点 List是如此有限 它不允许您移除电池分隔符 所以我搬到了ForEach
  • 检查 Jenkins 管道中是否存在插件 (Groovy)

    我想在我的管道中使用 Slack 通知插件 这非常简单 slackSend color danger message Everything broke 但是 如果 slackSend 不存在 我不希望构建中断 有没有办法先检查一下 你也许可
  • 使用 ggplot2 将每个第 N 轴标签加粗

    是否可以使用 ggplot2 将轴上的第 N 个刻度设为粗体 我只想将轴标记为粗体 小线 而不是文本 在绘图中显示每日数据时 这对于突出显示每 7 个刻度非常有用 我想保留每一天的刻度线 我无法找到有关此主题的任何内容 任何帮助将不胜感激
  • Python:将数据类型从整数更改为浮点时出现内存错误

    我有一个大小为 13000 300000 的数组 其中填充了从 0 到 255 的整数 我想将它们的数据类型从整数更改为浮点 就好像数据是 numpy 数组一样 data astype float 当将其数据类型从整数更改为浮点时 它显示内
  • Git 终端使用旧帐户将文件推送到我的新 github 帐户[重复]

    这个问题在这里已经有答案了 我最近创建了一个新的 github 帐户 当我尝试通过 git 终端将一些文件推送到我的新帐户的存储库中时 它告诉我无权访问新帐户 因此 我手动删除了之前帐户的旧凭据 并通过 git 终端保存了新凭据 现在 它将
  • ASP.NET MVC 子字符串帮助

    我有一个 ASP NET MVC 应用程序 用于显示新闻文章 对于主要段落 我有一个截断和 HTML 标签剥离器 例如 p p 这两个函数来自扩展 如下所示 public static string RemoveHTMLTags this
  • rsync 在传输过程中突然无限期挂起

    在过去的几年里 我一直在使用 rsync 单行程序将 Mac Mini 桌面 OSX 10 9 2 5 GHz i5 4 GB RAM 上的重要文件夹备份到 FreeNAS 盒子 0 7 2 Sabanda 修订版 5266 Pentium
  • 获取缩放散点图中的面积或元素

    我有以下问题 我想放大散点图 然后选择所有显示的元素 以某种方式获得放大散点图中的显示区域就足够了 从该区域的范围我可以确定哪些元素显示在该区域中 哪些不显示 edit 找到解决方案 实现 AxisChangeListener 接口 imp
  • Pandas:如何将系列的多重索引折叠为日期时间索引?

    作为后续Pandas groupby 按学期分组 https stackoverflow com questions 51854809 pandas groupby group by semester我需要将系列的多重索引折叠为日期时间索引
  • 如何在 ASP.Net MVC for Mono 中使用异步

    我正在使用 Visual Studio 2017 for Mac 在 Mono 中创建 ASP Net MVC 项目 我添加了基本的控制器 视图 模型等 并且运行良好 但是 一旦使 Index 方法异步 我就会收到以下错误 System I
  • 如何根据第三个变量对分散标记进行着色

    我想制作一个散点图 使用 matplotlib 其中点根据第三个变量进行着色 我已经非常接近这个了 plt scatter w M c p marker s 其中 w 和 M 是数据点 p 是我想要着色的变量 不过我想用灰度而不是彩色来做
  • Flutter Provider - 重建列表项而不是列表视图

    我正在使用 Provider 包来管理我的应用程序业务逻辑 但我遇到了一个问题 即正在重建整个 ListView 而不是单个 ListTile 下面的 UI 可让您更好地理解 目前 如果我滚动到列表底部 点击最后一项的复选框 我看不到复选框
  • SetHidden 不起作用[重复]

    这个问题在这里已经有答案了 我正在 cocoa 中开发一个应用程序 我需要隐藏放置在 NSView 中的进度条 并在那个地方显示一个 NSTextfield 我使用了以下代码 进度条设置隐藏 TRUE 文本字段设置隐藏 FALSE 但这个代
  • WebGL 上出现错误“Tex 图像 TEXTURE_2D level 0 正在引发延迟初始化”

    我收到错误消息 Error WebGL warning drawElements Tex image TEXTURE 2D level 0 is incurring lazy initialization 在 WebGL 上 我想知道它的实