Reading the docs node-webgl is not really compatible with actual 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
What it doesn't say and should is there are also things WebGL does that will not work on DesktopGL.
There are tons of work arounds in real WebGL implementations to work around those differences. Shaders on all WebGL implementations are re-written but looking at the implementation of node-webgl they aren't re-writing the shaders therefore they can't be working around the differences.
As one example there are words reserved in OpenGL GLSL that are not reserved in WebGL. WebGL implementations work around that. node-webgl will not.
On top of which there will be missing functions. For example WebGL has versions of texImage2D
and texSubImage2D
that take an HTMLImageElement
, or a HTMLCanvasElement
or an HTMLVideoElement
but those elements do not exist in node.js
Another is the whole interaction with depth and stencil buffer formats for renderbuffers
Another there's no support for the various pixelStorei
additions in WebGL
There are many many other similar issues.
Security
The biggest issue is WebGL is designed to be secure whereas OpenGL is not. One of the major goals of WebGL is security because an arbitrary web page is allowed to run GPU code on your machine. WebGL takes security extremely seriously which is why it took a couple of years from initial concept (just call OpenGL) to actually shipping WebGL live in browsers. It's also why many drivers are blacklisted and yet another reason shaders are re-written.
For example shaders are re-written to make sure the shaders met certain requirements and don't pass certain limits before being passed on to the driver. Identifiers are checked that they are not too long. They are all replaced by temporary identifiers to make sure there's no strange interactions. Field and array expressions are checked they are not too complex. Array index clamping instructs are added. Unicode is stripped (OpenGL shaders only support ASCII). Shader features that need to be enabled/disabled are. And many other things.
Another example is checking that all buffers and textures point to valid memory and that all data that will be accessed by a shader is accounted for. Memory that is allocated is cleared. Otherwise you can possibly use the driver to spy on all of both CPU and GPU memory.
WebGL guards against all these cases.
node-webgl on the other hand is just calling directly into the OpenGL driver leaving with no regards to security. If you pass user data through node-webgl you may be opening your server to severe security issues. Even if you don't pass user data you may accidentally allow reading uninitialized data from uncleared buffers and textures.
Arguably they should have named it node-opengl
since it's not really WebGL in any way shape or form. To be WebGL, at a minimum, they would need to pass the WebGL conformance tests to claim to be WebGL compatible.