javascript - 浏览器WebGL和node.js服务器的nod​​e-WebGL中可用的功能是否相同?

标签 javascript node.js cross-browser webgl

目前我正在尝试将基于浏览器的客户端体积渲染代码转换为服务器端基于纯 JavaScript 的渲染。我在服务器端使用node-webgl。

我使用基于开源 WebGL 的浏览器实现。我的问题是,基于浏览器的WebGL功能与node.js的node-WebGL功能相同吗?如果我在服务器上使用(除了浏览器交互),是否需要更改代码。诸如着色器启动、立方体缓冲区、帧缓冲区对象初始化等功能。它们会改变吗?

我的整个项目都是基于这样的假设:它有效,目前我面临一些错误,所以我想问我做的是正确的事情吗?

问候, 普拉吉瓦尔

最佳答案

阅读文档 node-webgl 与实际的 WebGL 并不真正兼容

WebGL is based on OpenGL ES, a restriction of OpenGL found on desktops, for embedded systems. Because this module wraps OpenGL, it is possible to do things that may not work on web browsers

它没有说但应该说的是,WebGL 所做的一些事情在 DesktopGL 上不起作用。

在实际的 WebGL 实现中,有大量的解决方法可以解决这些差异。所有 WebGL 实现上的着色器都被重写,但查看 node-webgl 的实现,它们没有重写着色器,因此它们无法解决差异。

举个例子,OpenGL GLSL 中保留了一些在 WebGL 中未保留的字。 WebGL 实现可以解决这个问题。 node-webgl 不会。

除此之外还会缺少一些功能。例如,WebGL 具有采用 HTMLImageElementHTMLCanvasElementtexImage2DtexSubImage2D 版本HTMLVideoElement 但这些元素在 node.js 中不存在

另一个是the whole interaction with depth and stencil buffer formats for renderbuffers

另一个不支持the various pixelStorei additions in WebGL

还有很多其他类似的问题。

安全

最大的问题是 WebGL 被设计为安全的,而 OpenGL 则不然。 WebGL 的主要目标之一是安全性,因为任意网页都可以在您的计算机上运行 GPU 代码。 WebGL 非常重视安全性,这就是为什么从最初的概念(简称 OpenGL)到在浏览器中实际发布 WebGL 花了几年时间。这也是许多驱动程序被列入黑名单的原因,也是重写着色器的另一个原因。

例如,着色器被重写,以确保着色器满足某些要求,并且在传递给驱动程序之前不会通过某些限制。检查标识符是否太长。它们都被临时标识符取代,以确保没有奇怪的交互。检查字段和数组表达式,它们不太复杂。添加了数组索引限制指令。 Unicode 被剥离(OpenGL 着色器仅支持 ASCII)。需要启用/禁用的着色器功能是。还有许多其他事情。

另一个示例是检查所有缓冲区和纹理是否都指向有效内存,以及着色器将访问的所有数据是否已被考虑在内。分配的内存被清除。否则,您可能会使用该驱动程序来监视所有 CPU 和 GPU 内存。

WebGL 可以防范所有这些情况。

另一方面,node-webgl 只是直接调用 OpenGL 驱动程序,不考虑安全性。如果您通过 node-webgl 传递用户数据,您的服务器可能会面临严重的安全问题。即使您不传递用户数据,您也可能会意外地允许从未清除的缓冲区和纹理中读取未初始化的数据。

可以说,他们应该将其命名为 node-opengl,因为它在任何形式上都不是真正的 WebGL。要成为 WebGL,至少需要通过 WebGL conformance tests声称兼容 WebGL。

关于javascript - 浏览器WebGL和node.js服务器的nod​​e-WebGL中可用的功能是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39658677/

相关文章:

javascript - window.devicePixelRatio 浏览器支持

javascript - Cordova 山羊;应用程序被杀死后发送本地通知,但在 android 上不起作用

node.js - Nodejs 使用 foreach 与 for 按顺序执行

javascript - 在迭代中解决 promise

css - 在哪里可以找到所有供应商前缀 CSS 属性/扩展的列表?

html - 跨浏览器、无 Javascript、跳过导航链接

javascript - jQuery 代码无法工作,无法理解标记

javascript - jquery:自动调整大小绝对定位子 div

javascript - 统计数据未定义

javascript - 始终将 JSON 解析为数组