[X3D-Ecosystem] Question for X3D Browser Developers
John Carlson
yottzumm at gmail.com
Thu Feb 26 18:39:36 PST 2026
I think that things might be more uniform structure-wise if GLSL model,
view, a d projection matrices are concerned. What I’m concerned with is
the uniforms I don’t control with fields.
That might be a first attempt, I would appreciate feedback on non-MaterialX
uniforms.
Thanks!
John
On Thu, Feb 26, 2026 at 6:17 PM Michalis Kamburelis via X3D-Ecosystem <
x3d-ecosystem at web3d.org> wrote:
>
> 1. To be clear, I second the idea to look at
> https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/DeveloperGuide/ShaderGeneration.md#162-variable-naming-convention by
> X3D browser implementors :) This proposes a standardized names for uniforms
> / attributes to pass to shaders for MaterialX. I am enthusiastic that our
> renderer (Castle Game Engine) could have an "alternative path" and
> generate uniforms / attributes this way, and thus support MaterialX
> within X3D. See https://castle-engine.io/roadmap#material_x for my
> plans how I want to do this.
>
>
>
> 2. However, I have to also point out some "bad news". It's
> 1. not as easy as using GLSL macros to normalize the names. I
> explain it below.
> 2. and it's not a solution for everything. MaterialX only
> standardizes things it cares about for its use-case, see below; this is a
> not solution to solve X3D browser incompatibilities in what uniforms /
> attributes we accept, and I don't even think its possible to solve it --
> browsers need special way to implement and optimize stuff on GPU, like
> shadows and skinned animation.
>
>
> Details:
>
> IMO using #define , to "normalize" the GLSL incompatibilities between
> browsers using GLSL macros, is not going to work. It will definitely not
> work for Castle Game Engine -- the list you ask about is just impossible to
> provide from my side, as CGE author. I could only provide a very incomplete
> and thus useless version (since even i_position vs castle_Vertex has
> different type, see below).
>
> The reason is that not only the names of uniforms all renderers (including
> all X3D browsers) use is different. Also our types, and expected usage, are
> different. Everyone is passing data in different structures (and often for
> good reasons - we have different set of features, different subset of
> platforms we want to support, different optimizations we have). E.g.
>
> - Light data, in "u_lightData" ( from
> https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/DeveloperGuide/ShaderGeneration.md#162-variable-naming-convention )
> is not something that any browser will have out of the box. We pass it in
> CGE without structures, using a combination of uniforms and #define
> conditionals, to make light computation as optimized as possible.
> - Even simple things are incompatible. E.g. CGE has "castle_Vertex",
> which is almost like "i_position" that MaterialX defines... but our
> castle_Vertex are 4D (passed in homogeneous coordinates, for good reasons
> -- we render also shadow quads for shadow volumes). While "i_position" is
> 3D. So even providing a simple rename for this most basic thing is
> impossible. Again, for good reasons. We can have "alternative MaterialX
> naming" in CGE, but you cannot just rename "castle_Vertex ->
> i_position". We need our internal shaders to handle shadow quads for shadow
> volumes.
> - CGE doesn't pass i_bitangent as an attribute, we pass only tangent
> (and we calculate bitangent in GLSL code).
> - CGE provides texture coordinates using various types - vec2, vec3,
> vec4, depending on the definition. (And for computed texture coords, in a
> different way.) So "i_texcoord_N" as "just vec2" as defined by
> MaterialX is not possible. MaterialX doesn't account for non-2D and/or
> computed textures.
> - Stuff like u_worldMatrix , u_worldInverseMatrix, u_viewMatrix etc. -
> we have this information, passed under certain conditions. For MaterialX,
> we would just pass it always, if shader linking stage shows we have this
> uniform. But that's not something we do by default for internal shaders, as
> there's no need for it.
> - The list goes on. For pretty much variable on the
> https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/DeveloperGuide/ShaderGeneration.md#162-variable-naming-convention
> list:
> - A. it is _obvious how to implement support for it_
> - but also B. we _do not have a direct trivial equivalent for it
> right now_. Not something you can have just renaming castle_Xxx -> into
> standardized MaterialX name.
> -
>
> To be clear, I think the list of MaterialX is great, and I want to have
> CGE option to "generate uniforms / attributes following this convention".
> As we talked yesterday, as I documented on
> https://castle-engine.io/roadmap#material_x . I would encourage other
> browser developers to look into this too -- to have an _option_ for this.
>
> But:
>
> - You cannot achieve this by simple rename. The generation of
> MaterialX-compatible names requires cooperation from the rendering code
> (like Pascal code, in case of CGE; JavaScript code in case of X_ITE/X3DOM
> etc.). You cannot just get it by renaming the uniforms/attributes generated
> now.
> - Remember this is not a panacea for all shader incompatibilities:)
> - Material parameters (like uniform names for color, roughness
> etc.) are not standardized. Which is correct for the MaterialX use-case --
> MaterialX consumes the material parameters, so when you export it, you can
> set both the material parameter names (in ComposedShader, PackagedShader)
> and consume them (in shader code, in MarerialX XML or in GLSL).
> - There are still unsolved things. E.g. when using ComposedShader with
> GLSL generated -- we cannot have shadow map receiving, or skinned animation
> on GPU, since this requires both information (uniforms) and shader code
> which our internal shaders have, but your generated ones will not.
>
>
> Regards,
> Michalis
>
>
>
> On Thursday, February 26th, 2026 at 16:59, Bergstrom, Aaron via
> X3D-Ecosystem <x3d-ecosystem at web3d.org> wrote:
>
> X3D Browser Devs,
>
>
>
> So all… please correct me if you think I’ve over simplified what I’ve
> written below.
>
>
>
> Based on my conversation with Michalis, the existing X3D browsers
> (FreeWRL, X3DOM, X_ITE, and CGE) all have different shader naming
> conventions for their GLSL uniform, in, and out variables.
>
>
>
> Any particular browser’s naming convention may, or may not, match the list
> of MaterialX shader variable naming conventions found at the url below:
>
>
> https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/DeveloperGuide/ShaderGeneration.md
>
>
>
> However, based on my reading, it seems to me that I can inject the proper
> naming conventions into the *.frag and *.vert files as a ‘#define’ alias
> before writing the files to disk.
>
>
>
> Then I could add your browser’s aliases to the field names of the exported
> X3D shader node.
>
>
>
> An injected alias would look something like this (just a random example of
> a GLSL shader alias):
>
> #define vd_tangentWorld vd.tangentWorld
>
> #define vd_normalWorld vd.normalWorld
>
>
>
> I would ask that each browser vendor provide me with a list of the naming
> conventions for their browser shader’s naming conventions that match up
> with the MaterialX naming conventions found at the link above.
>
>
>
> If I have that list, I can just add those alias’ to the GLSL file before
> writing it to disk, and write out a version of the X3D shader that matches
> your browser’s naming conventions.
>
>
>
> I just need the alias list for your browser and we should be good to go
> for supporting MaterialX shader export from Maya.
>
>
>
> Aaron
>
>
> --
> X3D-Ecosystem mailing list
> X3D-Ecosystem at web3d.org
> http://web3d.org/mailman/listinfo/x3d-ecosystem_web3d.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-ecosystem_web3d.org/attachments/20260226/f9d2af19/attachment.html>
More information about the X3D-Ecosystem
mailing list