Skip to content

Materials as assets and property type #5457

Description

@mrxz

Description:
The current approach for materials requires materials to be defined per entity, without an easy way to re-use them. While mixins can be used to avoid the repetition in the HTML, it brings little to no runtime benefits. Instead, a material asset type could be introduced along with an accompanying property type. This would allow materials to be re-used and also passed to components.

Pseudo-code:

<a-assets>
  <a-material id="wood" shader="phong" src="url(./wood.png)"></a-material>
  <a-material id="red" shader="flat" color="red"></a-material>
</a-assets>

<a-box material="material: #wood"></a-box>
<a-entity hands-tracking-controls="hand: right; handMaterial: #red"></a-entity>

This would bring quite a few benefits as well as open the door to various possible optimizations:

  • All defined materials and textures can be compiled/uploaded during the loading screen, minimizing stutters at runtime
  • Memory usage can be reduced by re-using the same material instance
  • When used throughout a scene, the sorting could take material ID in account (default behaviour in vanilla Three.js), reducing program switches
  • Would potentially introduce a non-intrusive way to use BatchedMesh (Consider an A-Frame API to expose THREE.BatchedMesh  #5396), as it requires the same material to be used
  • Components can expose a single material property instead of individual properties for each tunable material property, allowing for greater flexibility (for example, changes like this would no longer be needed)
  • Third party libraries could create materials on the fly that can be applied through common A-Frame approaches instead of Three.js, without having to register a shader for it.

To maintain backwards compatibility, the material component can still create materials on the fly, making it an opt-in feature for users to use. For components that would normally use a single color property and now a material property, it might be desirable to have a short-hand to also create "in-line" materials in properties, e.g.:

<a-entity hands-tracking-controls="hand: right; handMaterial: material(color: red)"></a-entity>

Alternatively a component can of-course continue to expose both the individual properties besides a material property.

Feedback and suggestions are welcome.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions