浏览器中的WebGL和node.js服务器的节点-WebGL是否可用?

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

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

我的整个项目都是基于这样的假设,即现在我面临一些错误,所以我想问我做对了吗?

问候,Prajwal

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

WebGL基于OpenGL ES,这是embedded式系统在桌面上的OpenGL限制。 因为这个模块封装了OpenGL,所以有可能做一些在Web浏览器上不起作用的东西

什么它不说,应该是也有WebGL的东西,不会在DesktopGL上工作。

在真正的WebGL实现中有大量的工作来解决这些差异。 所有WebGL实现上的着色器都被重写了,但是看着node-webgl的实现,他们并没有重写着色器,因此他们不能在解决这些差异。

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

最重要的是会失去function。 例如,WebGL具有texImage2DtexSubImage2D版本,它们采用HTMLImageElementHTMLCanvasElementHTMLVideoElement但这些元素不存在于node.js中

另一个是与渲染缓冲区的深度和模板缓冲区格式的整个交互

另一个不支持WebGL中的各种pixelStorei添加

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

安全

最大的问题是WebGL的devise是安全的,而OpenGL则不是。 WebGL的主要目标之一是安全性,因为任意网页都可以在你的机器上运行GPU代码。 WebGL非常重视安全性,这就是为什么从最初的概念(只需调用OpenGL)到实际在浏览器中实际运送WebGL的原因。 这也是为什么很多驱动程序被列入黑名单的原因,另一个原因是着色器被重写。

例如着色器被重写,以确保着色器符合某些要求,在传递给驱动程序之前不会超过一定的限制。 标识符被检查,他们不是太长。 它们全部被临时标识符取代以确保没有奇怪的相互作用。 字段和数组expression式被检查,他们不是太复杂。 数组索引夹紧指令被添加。 Unicode被剥离(OpenGL着色器只支持ASCII)。 需要启用/禁用的着色器function是。 还有很多其他的东西

另一个例子是检查所有的缓冲区和纹理指向有效的内存,并且所有将被着色器访问的数据都被计算在内。 分配的内存被清除。 否则,您可以使用驱动程序来窥探所有的CPU和GPU内存。

WebGL防范所有这些情况。

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

可以说他们应该把它命名为node-opengl因为它不是以任何forms或forms的WebGL。 要成为WebGL,他们至less需要通过WebGL一致性testing来声明WebGL兼容。

是的,这些function与node-webgl是一个WebGL实现相同,但是…服务器中的OpenGL驱动程序可能与您通常在客户端中的OpenGL驱动程序非常不同。 服务器很可能没有启用OpenGL的graphics卡,甚至没有graphics卡。 这可能是你得到错误的原因。 你应该尝试发布这些错误,所以我们有更多的信息。

此外,您可以尝试运行node-webgltesting(在https://github.com/mikeseven/node-webgl/tree/master/test )以查看您的服务器是否可以正确运行它们。