我在页面上设置了一个 webgl 画布,并在启动时使用了这些参数:
gl = canvas.getContext("webgl", {
alpha: true,
premultipliedAlpha: false
});
Run Code Online (Sandbox Code Playgroud)
然后我做了所有的设置工作来制作一个程序、一个顶点着色器和一个片段着色器。
我的顶点着色器只给我一个 2d 绘图表面,我的片段着色器如下所示:
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.1);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想做的就是在页面上绘制一个透明的白色框。这适用于我测试过的所有浏览器,除了 safari/ios。在 safari 中,盒子是全白色的,看不到透明度。
这是蓝色页面背景的并排屏幕截图:
我是否应该设置其他参数才能使其正常工作?或者ios与其他浏览器有不同的行为吗?
更新:如果我在调用片段着色器后运行清除颜色命令(意味着着色器输出被擦除并替换为清除颜色),则 webgl 画布是透明的。
gl.clearColor(0.0, 0.0, 0.0, 0.1);
gl.clear(gl.COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
然而,除了制作纯色半透明颜色之外,这并不能让我做太多事情。我希望在片段着色器本身中实现可变透明度。
我在这里搜索了答案,但我只能找到其他语言的问题.
所以我有2个Uint8类型的数组.
var arr1 = [0,0,0];
var arr2 = [0,1,2,3,4,5,6,7,8,9];
Run Code Online (Sandbox Code Playgroud)
我想从第4个位置开始用arr1替换arr2的内容.所以arr2将是:
arr2 = [0,1,2,0,0,0,6,7,8,9];
Run Code Online (Sandbox Code Playgroud)
如果我没有尝试在数组中间执行此操作,我可以使用如下设置:
arr2.set(arr1);
Run Code Online (Sandbox Code Playgroud)
我会得到:
arr2 = [0,0,0,4,5,6,7,8,9];
Run Code Online (Sandbox Code Playgroud)
我知道我可以循环遍历arr2并单独复制值,但性能方面这与set相比非常慢(并且性能对我很重要,因为它每秒24次复制整个canvas画布img数据).
是否有任何函数可以复制到数组的中间,但具有set的性能?
我正在开发一个在屏幕上显示图形的HTML 画布应用程序。图形对于网站来说并不重要,它们只是让事情看起来更漂亮。
我的问题是应用程序需要设备的CPU以一定的速度运行,否则帧速率变得不可接受。
任何现代手机/笔记本电脑都可以轻松运行该应用程序,但当然并不是每个人都拥有更新的技术。
那时我想放弃对该设备的支持并停止渲染动画,因为它弊大于利。
这个想法在互联网上非常标准。例如,如果您想要为网站提供图像背景,但不希望手机加载与桌面相同的大图像,那么您只需使用一些 CSS 查询来仅将图像提供给桌面。
这就是我们如何在保持向后兼容性的同时推出新功能。
然而,当谈到检测性能时,这并不像听起来那么容易。没有办法用 Javascript 来获取 CPU 规格,即使我可以,也没有办法知道用户在他们的机器上运行着什么。
这给我留下了两个选择,要么在启动画布应用程序之前运行一个小型性能测试。或者启动应用程序并尝试运行几帧,如果帧速率太低则停止它。
问题是这两个选项都非常粗略,因为设备在应用程序启动时可能会出现“速度打嗝”,所以我无缘无故地关闭了动画。
此外,如果用户的设备正好位于阈值边界上,有时动画会加载,有时则不会,这可能会造成混淆。
互联网上有没有任何“标准”来处理此类问题?当动画关闭时,最好在网站窗口底部留下脚注吗?
或者这只是你在突破界限和处理性能时必须接受的事情?
我正在研究 Gzip 的内部工作原理,我知道它使用了Huffman 编码和LZ77的组合。
我还意识到 Gzip 文件被分为块,每个块都有一个为其构建的字典。然后,频繁出现的相似数据将被指向字典中位置的指针所取代。
因此,短语“horses race other horses”会将马一词替换为指针。
但是,如果我有一个 32 位整数数组,但它最多只能存储 24 位数字怎么办?为了便于论证,我们可以假设这些 24 位数字非常随机,难以压缩且难以找到重复。
这将使每个整数的前 8 位成为易于压缩的 0 字符串,但每个字符串都需要一个指针,并且每个指针仍然占用一定量的数据。即使是 1 位指针(我知道比实际可能的小)仍然会占用原始空间的 12.5%。
当数组可以很容易地简化为具有基本模式识别功能的“24 位”数组时,这似乎有点多余。
所以我的问题是:
Gzip 是否包含比字典指针更好地压缩文件的机制?
Gzip 压缩少量重复数据以及少量难以压缩数据的效果如何?
假设您有一个 32x32 的网格,可以使用以下任何块大小随机细分:
32x32、16x16、8x8、4x4
网格被细分多少次以及以何种方式进行细分是随机确定的。
从视觉上看,它可能看起来像这样:
这种类型的数据可以使用四叉树来表示。
我的问题是:
如果我尝试使用尽可能少的字节来表示上图,线性四叉树是否是最有效的方法?
我能想到的唯一其他选择是制作图表的所有可能组合,并使用单个数字来表示每个组合。
因此,对于该图,有 4 个分支级别(32x32、16x16、8x8、4x4),这将为我们提供 4^0 + 4^1 + 4^2 + 4^3 种可能的组合,等于 85 种组合。
因此,我能想到的存储图形的最小方法是使用 7 位(1010101 是二进制数 85)来表示可能的组合。
线性四叉树在存储效率方面会与此相同,还是会占用更多或更少的空间?
javascript ×3
compression ×2
arrays ×1
deflate ×1
gzip ×1
html ×1
performance ×1
quadtree ×1
webgl ×1