- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 HTML5 网络冒险游戏并使用 Tiled 制作图 block map 。 .
即使有 Texture Packer ,我似乎超出了纹理单元的最大缓存,因为我收到了错误
Texture cache overflow: 16 texture units available
WebGL Stats显示约 70% 的设备的限制为 16。我的浏览器,如图here ,支持16个纹理单元:
在游戏中,我打开 Chrome 控制台来检查 WebGL 规范:
WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS
= 34930WebGL2RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS
= 35660WebGL2RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS
= 35661这有点令人困惑,如 this article显示输出应该在 0-10 范围内,而不是 30,000 范围内:
maxTextureUnits = 8
maxVertexShaderTextureUnits = 4
maxFragmentShaderTextureUnits = 8
我的问题:
最佳答案
检查这些值的方法是
const maxFragmentShaderTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
const maxVertexShaderTextureUnits = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
const maxTextureUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);
此外,这些值与您可以在单个着色器中访问的纹理数量有关,而不是与您总共可以拥有的纹理数量有关。
它们也与“缓存”无关
在您的情况下,您可能希望将纹理组合成单个纹理图集(一个包含所有图 block 的纹理)。
Here's some code that does that 。它加载一个平铺的 json 文件,然后加载所有引用的图像,然后创建一个 2D Canvas 并将每个图像中的图 block 复制到 Canvas 中,重新映射 map 中的图 block 以匹配。完成后,它使用 Canvas 作为图 block 纹理的来源。通常我会离线执行此操作,但很高兴能够点击“重新加载”来查看我在运行时留下的新 map 。
在同一个库中是 a shader that draws tilemaps包括翻转和旋转的瓷砖。换句话说,要绘制平铺 map ,每层需要一次绘制调用,并且仅使用 2 个纹理。一个纹理保存图 block 图像(上面创建的纹理)。另一个纹理包含一层平铺 map 。着色器读取平铺贴图纹理,并使用它从平铺图像纹理中绘制正确的平铺。你可以看到这个技术的解释in this article
顺便说一句:带有平铺加载程序的库还有 a shader that can selectively adjust the hue of a sprite 。该库用于一些游戏,例如 this game
- How can I determine which images in my packed texture atlas are causing the issues? I.e., how can I check the total textures?
您管理纹理,而不是 WebGL,因此如果您想知道使用了多少纹理,请添加一些代码来计算它们。
- Is it possible to force a higher cache limit?
不,但正如我上面所说,这与任何缓存无关。
我的猜测是您正在使用某些库或您自己的代码正在生成着色器,并且您正在向其添加越来越多的纹理,着色器生成器因此会生成使用太多纹理的着色器。问题是为什么在同一个绘图中使用这么多纹理。据我所知,没有任何 2D 游戏在一次绘制调用中使用超过 2 到 6 个纹理。游戏可能使用 10000 个纹理,但要绘制单个 Sprite 或一层图 block map ,只需要 1 或 2 个纹理。
换句话说。一个典型的游戏就可以了
for each layer of tilemap
bind texture atlas for layer (assming it's different than other layers)
draw layer
for each sprite
bind texture for sprite
draw sprite
在上面的示例中,即使您有 10000 个纹理,一次也只会使用 1 个纹理,因此您不会遇到任何限制。
关于javascript - WebGL HTML5 游戏的纹理缓存溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683611/
一些网站说你应该通过以下方式初始化 webgl: var gl = c.getContext("webgl") || c.getContext("experimental-webgl"); if (!
我一直在寻找有关 WebGL 的信息以及可以分配用于渲染的最大纹理数/内存量。这显然是特定于硬件/设备的,因此我正在寻找一种智能处理纹理的方法。 我目前有 512x512 RGBA8 格式的纹理。一个
我想知道是否可以利用WebGL进行任何异步调用? 我研究了Spec v1和Spec v2,他们什么都没提及。在V2中,有一种WebGL查询机制,我认为这不是我想要的。 在网络上进行搜索并没有确定的定义
我正在参与一个 webgl 项目。 当我调用 gl.DrawElements 时,会显示错误“范围超出缓冲区范围”。 我肯定确保我传递了正确的缓冲区长度或偏移量。但是,仍然显示错误。 我认为有几个原因
我知道 WebGL 中有 8 个纹理的限制。 我的问题是,8 是全局限制还是每个着色器/程序明智的? 如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服上,我就可以开
我一直在使用 Haxe + Away3D 编写一个小型行星生成器,并将其部署到 HTML5/WebGL。但是在渲染云时我遇到了一个奇怪的问题。我有行星网格,然后云网格在相同位置稍大一些。 我正在使用柏
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
在 OpenGL 中,深度缓冲区值是根据场景的近和远裁剪平面计算的。 (引用:Getting the true z value from the depth buffer) 这在 WebGL 中是如何
简单的问题,但我无法在任何地方的规范中找到答案。我可能在某处遗漏了明显的答案。 我可以在 WebGL 片段着色器中同时使用多少个纹理?如果它是可变的,那么假设 PC 使用的合理数字是多少? (对移动不
我有一个渲染场景的帧缓冲区,现在我想将它渲染到“全屏”四边形。如何设置我的相机以及我应该在我的顶点着色器中放置什么以便将帧缓冲区的纹理渲染到整个屏幕。 我试过像这样创建一个全屏四边形 var gl =
我正在阅读 here 的教程。 var gl; function initGL() { // Get A WebGL context var canvas = document.getEle
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在学习 WebGL,我能感觉到我的速度很慢,因为我很难调试我的代码。是否有任何扩展或工具可以帮助我知道缓冲区、属性指针、矩阵等的值。 我在谷歌上搜索并了解了 chrome 扩展程序 spector
我可以在某处找到任何文档来记录 WebGL 调用所需的先决条件吗? 我已经对 WebGL 基础有了相当深入的了解,但现在我正在创建自己的“框架”,并且我正在更深入地了解。 例如, enableVert
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我有兴趣在 webgl 中执行一些密集计算,所以它在 GPU 上运行。 大多数文档都讨论了如何渲染图形。 我正在完成非常简单的任务:对于给定的图像,将其转换为灰度,并找到局部最大值的坐标(比其邻居更亮
我目前在 WebGL 中使用这个片段着色器来对照片纹理应用高光/阴影调整。 着色器本身是直接从优秀的 GPUImage 中拉出来的适用于 iOS 的库。 uniform sampler2D input
我是 webgl 的新手。我正在尝试设置时间统一,因此我可以随着时间的推移更改片段着色器的输出。我认为这实现起来相当简单,但我正在努力。我知道这两种方法可能涉及: https://developer.
我正在尝试使用两个 Canvas 并排绘制相同的 WebGL 场景。是否可以?到目前为止,我还没有走运。 思路如下: 我加载几何 我设置了两个gl上下文,每幅 Canvas 一个 我调用 drawEl
我正在学习 WebGL 并尝试显示一个球体。没有纹理,只有每个顶点着色,但我在 Opera 和 Chrome 中收到以下错误消息:“[.WebGLRenderingContext]GL 错误:GL_I
我是一名优秀的程序员,十分优秀!