浏览器 WebGL 和 node.js 服务器的节点 WebGL 中可用的功能是否相同?
Are functions available in browser WebGL and node.js server's node-WebGL same?
目前我正在尝试将基于浏览器的客户端体积渲染代码转换为服务器端纯 javascript 渲染。我在服务器端使用 node-webgl。
我使用基于开源 WebGL 的浏览器实现。我的问题是,基于浏览器的 WebGL 功能是否与 node.js node-WebGL 功能相同?如果我在服务器上使用(除了浏览器交互),是否需要更改代码?着色器启动、立方体缓冲区、帧缓冲区对象初始化等功能。它们会改变吗?
我的整个项目都是基于这个假设,它是有效的,目前我遇到了一些错误,所以我想问问我做对了吗?
此致,
帕吉瓦尔
是的,功能与 node-webgl 相同,是一个 WebGL 实现,但是……服务器中的 OpenGL 驱动程序可能与您通常在客户端中使用的驱动程序有很大不同。服务器很可能没有支持 OpenGL 的显卡,甚至根本没有显卡。这可能是您收到错误的原因。您应该尝试发布这些错误,以便我们获得更多信息。
此外,您可以尝试 运行 进行 node-webgl 测试(在 https://github.com/mikeseven/node-webgl/tree/master/test)以查看您的服务器是否可以 运行 它们正确。
阅读文档 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 的 texImage2D
和 texSubImage2D
版本采用 HTMLImageElement
、HTMLCanvasElement
或 HTMLVideoElement
,但这些元素在 [=52 中不存在=]
另一个是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)。需要 enabled/disabled 的着色器功能是。还有很多其他的东西。
另一个例子是检查所有缓冲区和纹理是否指向有效内存,以及所有将由着色器访问的数据是否已被考虑在内。分配的内存被清除。否则,您可能会使用该驱动程序监视所有 CPU 和 GPU 内存。
WebGL 防范所有这些情况。
另一方面,node-webgl 只是直接调用 OpenGL 驱动程序而没有考虑安全性。如果您通过 node-webgl 传递用户数据,您可能会使您的服务器面临严重的安全问题。即使您不传递用户数据,您也可能不小心允许从未清除的缓冲区和纹理中读取未初始化的数据。
可以说他们应该将其命名为 node-opengl
,因为它在任何形状或形式上都不是真正的 WebGL。要成为 WebGL,至少,他们需要通过 WebGL conformance tests 以声称与 WebGL 兼容。
目前我正在尝试将基于浏览器的客户端体积渲染代码转换为服务器端纯 javascript 渲染。我在服务器端使用 node-webgl。
我使用基于开源 WebGL 的浏览器实现。我的问题是,基于浏览器的 WebGL 功能是否与 node.js node-WebGL 功能相同?如果我在服务器上使用(除了浏览器交互),是否需要更改代码?着色器启动、立方体缓冲区、帧缓冲区对象初始化等功能。它们会改变吗?
我的整个项目都是基于这个假设,它是有效的,目前我遇到了一些错误,所以我想问问我做对了吗?
此致, 帕吉瓦尔
是的,功能与 node-webgl 相同,是一个 WebGL 实现,但是……服务器中的 OpenGL 驱动程序可能与您通常在客户端中使用的驱动程序有很大不同。服务器很可能没有支持 OpenGL 的显卡,甚至根本没有显卡。这可能是您收到错误的原因。您应该尝试发布这些错误,以便我们获得更多信息。
此外,您可以尝试 运行 进行 node-webgl 测试(在 https://github.com/mikeseven/node-webgl/tree/master/test)以查看您的服务器是否可以 运行 它们正确。
阅读文档 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 的 texImage2D
和 texSubImage2D
版本采用 HTMLImageElement
、HTMLCanvasElement
或 HTMLVideoElement
,但这些元素在 [=52 中不存在=]
另一个是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)。需要 enabled/disabled 的着色器功能是。还有很多其他的东西。
另一个例子是检查所有缓冲区和纹理是否指向有效内存,以及所有将由着色器访问的数据是否已被考虑在内。分配的内存被清除。否则,您可能会使用该驱动程序监视所有 CPU 和 GPU 内存。
WebGL 防范所有这些情况。
另一方面,node-webgl 只是直接调用 OpenGL 驱动程序而没有考虑安全性。如果您通过 node-webgl 传递用户数据,您可能会使您的服务器面临严重的安全问题。即使您不传递用户数据,您也可能不小心允许从未清除的缓冲区和纹理中读取未初始化的数据。
可以说他们应该将其命名为 node-opengl
,因为它在任何形状或形式上都不是真正的 WebGL。要成为 WebGL,至少,他们需要通过 WebGL conformance tests 以声称与 WebGL 兼容。