API Docs for: 1.0.0

MetallicMaterial

Extends Material
Module: materials
Parent Module: xeogl

A MetallicMaterial is a physically-based Material that defines the surface appearance of Entities using the metallic-roughness workflow.

Examples

Metallic Vs Roughness
glTF models with PBR materials Fire hydrant model Sample metal materials Metallic Vs. roughness

Overview

  • MetallicMaterial is usually used for conductive materials, such as metal.
  • SpecularMaterial is usually used for insulators, such as wood, ceramics and plastic.
  • PhongMaterial is usually used for non-realistic objects.

For an introduction to PBR concepts, try these articles:

The following table summarizes MetallicMaterial properties:

Property Type Range Default Value Space Description
baseColor Array [0, 1] for all components [1,1,1,1] linear The RGB components of the base color of the material.
metallic Number [0, 1] 1 linear The metallic-ness the material (1 for metals, 0 for non-metals).
roughness Number [0, 1] 1 linear The roughness of the material surface.
specularF0 Number [0, 1] 1 linear The specular Fresnel of the material surface.
emissive Array [0, 1] for all components [0,0,0] linear The RGB components of the emissive color of the material.
opacity Number [0, 1] 1 linear The transparency of the material surface (0 fully transparent, 1 fully opaque).
baseColorMap Texture null sRGB Texture RGB components multiplying by baseColor. If the fourth component (A) is present, it multiplies by opacity.
metallicMap Texture null linear Texture with first component multiplying by metallic.
roughnessMap Texture null linear Texture with first component multiplying by roughness.
metallicRoughnessMap Texture null linear Texture with first component multiplying by metallic and second component multiplying by roughness.
emissiveMap Texture null linear Texture with RGB components multiplying by emissive.
opacityMap Texture null linear Texture with first component multiplying by opacity.
occlusionMap Texture null linear Ambient occlusion texture multiplying by surface's reflected diffuse and specular light.
normalMap Texture null linear Tangent-space normal map.

Usage

In the example below we'll create the yellow fire hydrant shown in the example screen shots above. Our hydrant Entity has:

  • a OBJGeometry which loads the fire hydrant mesh from an .OBJ file,
  • a Lights containing DirLights, plus CubeTextures for light and reflection maps, and
  • a MetallicMaterial with Textures providing diffuse, metallic, roughness, occlusion and normal maps.

Note that in this example we're providing separate Textures for the metallic and roughness channels, which allows us a little creative flexibility. Then, in the next example further down, we'll combine those channels within the same Texture for efficiency.

new xeogl.Entity({

   geometry: new xeogl.OBJGeometry({
       src: "models/obj/FireHydrantMesh.obj"
   }),

   lights: new xeogl.Lights({
       lights: [
           new xeogl.DirLight({
               dir: [0.8, -0.6, -0.8],
               color: [0.8, 0.8, 0.8],
               space: "view"
           }),
           new xeogl.DirLight({
               dir: [-0.8, -0.4, -0.4],
               color: [0.4, 0.4, 0.5],
               space: "view"
           }),
           new xeogl.DirLight({
               dir: [0.2, -0.8, 0.8],
               color: [0.8, 0.8, 0.8],
               space: "view"
           })
       ],
       lightMap: new xeogl.CubeTexture({
           src: [
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_PX.png",
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_NX.png",
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_PY.png",
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_NY.png",
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_PZ.png",
               "textures/light/Uffizi_Gallery/Uffizi_Gallery_Irradiance_NZ.png"
           ]
       }),
       reflectionMap: new xeogl.CubeTexture({
           src: [
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_PX.png",
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_NX.png",
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_PY.png",
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_NY.png",
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_PZ.png",
               "textures/reflect/Uffizi_Gallery/Uffizi_Gallery_Radiance_NZ.png"
           ]
       })
   }),

   material: new xeogl.MetallicMaterial({

       // Channels with default values, just to show them

       baseColor: [1.0, 1.0, 1.0],
       metallic: 1.0,
       roughness: 1.0,
       emissive: [0.0, 0.0, 0.0],
       opacity: 1.0,

       // Textures to multiply by some of the channels

       baseColorMap : new xeogl.Texture({  // Multiplies by baseColor
           src: "textures/diffuse/fire_hydrant_Base_Color.png"
       }),

       metallicMap : new xeogl.Texture({   // R component multiplies by metallic
           src: "textures/metallic/fire_hydrant_Metallic.png"
       }),

       roughnessMap : new xeogl.Texture({  // R component multiplies by roughness
           src: "textures/roughness/fire_hydrant_Roughness.png"
       }),

       occlusionMap : new xeogl.Texture({  // Multiplies by fragment alpha
           src: "textures/occlusion/fire_hydrant_Mixed_AO.png"
       }),

       normalMap : new xeogl.Texture({
           src: "textures/normal/fire_hydrant_Normal_OpenGL.png"
       })
   })
});

Combining channels within the same textures

In the previous example we provided separate Textures for the metallic and roughness channels, but we can combine those channels into the same Texture to reduce download time, memory footprint and rendering time (and also for glTF compatibility).

Here's our MetallicMaterial again with those channels combined in the metallicRoughnessMap Texture, where the R component multiplies by metallic and G multiplies by roughness.

new xeogl.MetallicMaterial({

   baseColor: [1,1,1], // Default value
   metallic: 1.0,      // Default value
   roughness: 1.0,     // Default value

   baseColorMap : new xeogl.Texture({
       src: "textures/diffuse/fire_hydrant_Base_Color.png"
   }),
   metallicRoughnessMap : new xeogl.Texture({
       src: "textures/metallicRoughness/fire_hydrant_MetallicRoughness.png"
   }),
   occlusionMap : new xeogl.Texture({
       src: "textures/occlusion/fire_hydrant_Mixed_AO.png"
   }),
   normalMap : new xeogl.Texture({
       src: "textures/normal/fire_hydrant_Normal_OpenGL.png"
   })
});

Although not shown in this example, we can also texture opacity with the A component of diffuseMap's Texture, if required.

Constructor

MetallicMaterial

(
  • [scene]
  • [cfg]
)

Parameters:

  • [scene] Scene optional

    Parent Scene, creates this MetallicMaterial within the default Scene when omitted.

  • [cfg] optional

    The MetallicMaterial configuration.

    • [id] String optional

      Optional ID, unique among all components in the parent Scene, generated automatically when omitted.

    • [meta=null] String:Object optional

      Metadata to attach to this material.

    • [baseColor=[1,1,1]] Float32Array optional

      RGB diffuse color of this MetallicMaterial. Multiplies by the RGB components of baseColorMap.

    • [metallic=1.0] Number optional

      Factor in the range 0..1 indicating how metallic this MetallicMaterial is. 1 is metal, 0 is non-metal. Multiplies by the R component of metallicMap and the A component of MetallicMaterial/metalRoughnessMap:property.

    • [roughness=1.0] Number optional

      Factor in the range 0..1 indicating the roughness of this MetallicMaterial. 0 is fully smooth, 1 is fully rough. Multiplies by the R component of roughnessMap.

    • [specularF0=0.0] Number optional

      Factor in the range 0..1 indicating specular Fresnel.

    • [emissive=[0,0,0]] Float32Array optional

      RGB emissive color of this MetallicMaterial. Multiplies by the RGB components of emissiveMap.

    • [opacity=1.0] Number optional

      Factor in the range 0..1 indicating how transparent this MetallicMaterial is. A value of 0.0 indicates fully transparent, 1.0 is fully opaque. Multiplies by the R component of opacityMap and the A component, if present, of baseColorMap. Attached Entities will appear transparent only if they are also attached to Modes that have transparent set to true.

    • [baseColorMap=undefined] Texture optional

      RGBA Texture containing the diffuse color of this MetallicMaterial, with optional A component for opacity. The RGB components multiply by the baseColor property, while the A component, if present, multiplies by the opacity property.

    • [opacityMap=undefined] Texture optional

      RGB Texture containing this MetallicMaterial's opacity in its R component. The R component multiplies by the opacity property. Must be within the same Scene as this MetallicMaterial.

    • [metallicMap=undefined] Texture optional

      RGB Texture containing this MetallicMaterial's metallic factor in its R component. The R component multiplies by the metallic property. Must be within the same Scene as this MetallicMaterial.

    • [roughnessMap=undefined] Texture optional

      RGB Texture containing this MetallicMaterial's roughness factor in its R component. The R component multiplies by the roughness property. Must be within the same Scene as this MetallicMaterial.

    • [metallicRoughnessMap=undefined] Texture optional

      RGB Texture containing this MetallicMaterial's metalness in its R component and roughness in its G component. Its R component multiplies by the metallic property, while its G component multiplies by the roughness property. Must be within the same Scene as this MetallicMaterial.

    • [emissiveMap=undefined] Texture optional

      RGB Texture containing the emissive color of this MetallicMaterial. Multiplies by the emissive property. Must be within the same Scene as this MetallicMaterial.

    • [occlusionMap=undefined] Texture optional

      RGB ambient occlusion Texture. Within shaders, multiplies by the specular and diffuse light reflected by surfaces. Must be within the same Scene as this MetallicMaterial.

    • [normalMap=undefined] Texture optional

      RGB tangent-space normal Texture. Must be within the same Scene as this MetallicMaterial.

Methods

create

(
  • [cfg]
  • [instanceId]
)

Convenience method for creating a Component within this Component's Scene.

You would typically use this method to conveniently instantiate components that you'd want to share (ie. "instance") among your Entities.

The method is given a component type, configuration and optional instance ID, like so:

var material = myComponent.create(xeogl.PhongMaterial, {
     diffuse: [1,0,0],
     specular: [1,1,0]
}, "myMaterial");

The first time you call this method for the given type and instanceId, this method will create the PhongMaterial, passing the given attributes to the component's constructor.

If you call this method again, specifying the same type and instanceId, the method will return the same component instance that it returned the first time, and will ignore the configuration:

var material2 = component.create(xeogl.PhongMaterial, { specular: [1,1,0] }, "myMaterial");

So in this example, our PhongMaterial will continue to have the red specular and diffuse color that we specified the first time.

Each time you call this method with the same type and instanceId, the Scene will internally increment a reference count for the component instance. You can release the shared component instance with a call to Scene/putSharedComponent:method, and once you have released it as many times as you got it, the Scene will destroy the component.

Parameters:

  • [cfg] optional

    Configuration for the component instance - only used if this is the first time you are getting the component, ignored when reusing an existing instance.

  • [instanceId] String | Number optional

    Identifies the shared component instance. Note that this is not used as the ID of the component - you can specify the component ID in the cfg parameter.

Returns:

:

destroy

()

Destroys this component.

Fires a destroyed event on this Component.

Automatically disassociates this component from other components, causing them to fall back on any defaults that this component overrode on them.

TODO: describe effect with respect to #create

error

(
  • message
)

Logs an error for this component to the JavaScript console.

The console message will have this format: [ERROR] [<component type> =<component id>: <message>

Also fires the message as an error event on the parent Scene.

Parameters:

  • message String

    The message to log

fire

(
  • event
  • value
  • [forget=false]
)

Fires an event on this component.

Notifies existing subscribers to the event, optionally retains the event to give to any subsequent notifications on the event as they are made.

Parameters:

  • event String

    The event type name

  • value Object

    The event parameters

  • [forget=false] Boolean optional

    When true, does not retain for subsequent subscribers

isType

(
  • type
)
Boolean

Tests if this component is of the given type, or is a subclass of the given type.

The type may be given as either a string or a component constructor.

This method works by walking up the inheritance type chain, which this component provides in property superTypes, returning true as soon as one of the type strings in the chain matches the given type, of false if none match.

Examples:

var myRotate = new xeogl.Rotate({ ... });

myRotate.isType(xeogl.Component); // Returns true for all xeogl components
myRotate.isType("xeogl.Component"); // Returns true for all xeogl components
myRotate.isType(xeogl.Rotate); // Returns true
myRotate.isType(xeogl.Transform); // Returns true
myRotate.isType("xeogl.Transform"); // Returns true
myRotate.isType(xeogl.Entity); // Returns false, because xeogl.Rotate does not (even indirectly) extend xeogl.Entity

Parameters:

  • type String | Function

    Component type to compare with, eg "xeogl.PhongMaterial", or a xeogl component constructor.

Returns:

Boolean:

True if this component is of given type or is subclass of the given type.

log

(
  • message
)

Logs a console debugging message for this component.

The console message will have this format: [LOG] [<component type> <component id>: <message>

Also fires the message as a log event on the parent Scene.

Parameters:

  • message String

    The message to log

off

(
  • handle
)

Cancels an event subscription that was previously made with on or once.

Parameters:

  • handle String

    Publication handle

on

(
  • event
  • callback
  • [scope=this]
)
String

Subscribes to an event on this component.

The callback is be called with this component as scope.

Parameters:

  • event String

    The event

  • callback Function

    Called fired on the event

  • [scope=this] Object optional

    Scope for the callback

Returns:

String:

Handle to the subscription, which may be used to unsubscribe with {@link #off}.

once

(
  • event
  • callback
  • [scope=this]
)

Subscribes to the next occurrence of the given event, then un-subscribes as soon as the event is handled.

This is equivalent to calling on, and then calling off inside the callback function.

Parameters:

  • event String

    Data event to listen to

  • callback Function(data)

    Called when fresh data is available at the event

  • [scope=this] Object optional

    Scope for the callback

warn

(
  • message
)

Logs a warning for this component to the JavaScript console.

The console message will have this format: [WARN] [<component type> =<component id>: <message>

Also fires the message as a warn event on the parent Scene.

Parameters:

  • message String

    The message to log

Properties

baseColor

Float32Array

RGB diffuse color of this MetallicMaterial.

Multiplies by the RGB components of baseColorMap.

Fires a baseColor event on change.

Default: [1.0, 1.0, 1.0]

baseColorMap

Texture

RGB Texture containing the diffuse color of this MetallicMaterial, with optional A component for opacity.

The RGB components multiply by the baseColor property, while the A component, if present, multiplies by the opacity property.

Attached Entities will appear transparent only if they are also attached to Modes that have transparent set to true.

Must be within the same Scene as this MetallicMaterial.

Fires a baseColorMap event on change.

Default: undefined

destroyed

Boolean

True as soon as this Component has been destroyed

emissive

Float32Array

RGB emissive color of this MetallicMaterial.

Multiplies by emissiveMap.

Fires a emissive event on change.

Default: [0.0, 0.0, 0.0]

emissiveMap

Texture

RGB Texture containing the emissive color of this MetallicMaterial.

Multiplies by the emissive property.

Must be within the same Scene as this MetallicMaterial.

Fires a emissiveMap event on change.

Default: undefined

id

String final

Unique ID for this Component within its parent Scene.

isDefault

Boolean

Indicates whether this is one of the Scene's built-in Components.

json

JSON final

JSON object containing the state of this Component.

metadata

Object

Arbitrary, user-defined metadata on this component.

metallic

Number

Factor in the range [0..1] indicating how metallic this MetallicMaterial is.

1 is metal, 0 is non-metal.

Multiplies by the R component of metallicMap and the A component of MetallicMaterial/metalRoughnessMap:property.

Fires a metallic event on change.

Default: 1.0

metallicMap

Texture

RGB Texture containing this MetallicMaterial's metallic factor in its R component.

The R component multiplies by the metallic property.

Must be within the same Scene as this MetallicMaterial.

Fires a metallicMap event on change.

Default: undefined

metallicRoughnessMap

Texture

RGB Texture containing this MetallicMaterial's metalness in its R component and roughness in its G component.

Its R component multiplies by the metallic property, while its G component multiplies by the roughness property.

Must be within the same Scene as this MetallicMaterial.

Fires a metallicRoughnessMap event on change.

Default: undefined

normalMap

Texture

RGB tangent-space normal map Texture.

Must be within the same Scene as this MetallicMaterial.

Fires a normalMap event on change.

Default: undefined

occlusionMap

Texture

RGB ambient occlusion Texture attached to this MetallicMaterial.

Within shaders, multiplies by the specular and diffuse light reflected by surfaces.

Must be within the same Scene as this MetallicMaterial.

Fires a occlusionMap event on change.

Default: undefined

opacity

Number

Factor in the range [0..1] indicating how transparent this MetallicMaterial is.

A value of 0.0 indicates fully transparent, 1.0 is fully opaque.

Multiplies by the R component of opacityMap and the A component, if present, of baseColorMap.

Attached Entities will appear transparent only if they are also attached to Modes that have transparent set to true.

Fires an opacity event on change.

Default: 1.0

opacityMap

Texture

RGB Texture containing this MetallicMaterial's opacity in its R component.

The R component multiplies by the opacity property.

Must be within the same Scene as this MetallicMaterial.

Fires an opacityMap event on change.

Default: undefined

roughness

Number

Factor in the range [0..1] indicating the roughness of this MetallicMaterial.

0 is fully smooth, 1 is fully rough.

Multiplies by the R component of roughnessMap.

Fires a roughness event on change.

Default: 1.0

roughnessMap

Texture

RGB Texture containing this MetallicMaterial's roughness factor in its R component.

The R component multiplies by the roughness property.

Must be within the same Scene as this MetallicMaterial.

Fires a roughnessMap event on change.

Default: undefined

scene

Scene final

The parent Scene that contains this Component.

specularF0

Number

Factor in the range [0..1] indicating specular Fresnel value.

Fires a specularF0 event on change.

Default: 0.0

string

String final

Inherited from Component but overwritten in src/component.js:1058

String containing the serialized JSON state of this Component.

superTypes

Array of String final

An array of strings that indicates the chain of super-types within this component's inheritance hierarchy.

For example, if this component is a Rotate, which extends Transform, which in turn extends Component, then this property will have the value:

["xeogl.Component", "xeogl.Transform"]
                    

Note that the chain is ordered downwards in the hierarchy, ie. from super-class down towards sub-class.

type

String final

JavaScript class name for this Component.

This is used when loading Scenes from JSON, and is included in the JSON representation of this Component, so that this class may be instantiated when loading it from the JSON representation.

For example: "xeogl.AmbientLight", "xeogl.ColorTarget", "xeogl.Lights" etc.

Events

baseColor

Fired whenever this MetallicMaterial's baseColor property changes.

Event Payload:

  • value Float32Array

    The property's new value

baseColorMap

Fired whenever this MetallicMaterial's baseColorMap property changes.

Event Payload:

  • value Object

    Number The property's new value

destroyed

Fired when this Component is destroyed.

emissive

Fired whenever this MetallicMaterial's emissive property changes.

Event Payload:

  • value Float32Array

    The property's new value

emissiveMap

Fired whenever this MetallicMaterial's emissiveMap property changes.

Event Payload:

  • value Object

    Number The property's new value

metallic

Fired whenever this MetallicMaterial's metallic property changes.

Event Payload:

  • value Float32Array

    The property's new value

metallicMap

Fired whenever this MetallicMaterial's metallicMap property changes.

Event Payload:

  • value Object

    Number The property's new value

metallicRoughnessMap

Fired whenever this MetallicMaterial's metallicRoughnessMap property changes.

Event Payload:

  • value Object

    Number The property's new value

normalMap

Fired whenever this PhongMaterial's normalMap property changes.

Event Payload:

  • value Object

    Number The property's new value

occlusionMap

Fired whenever this MetallicMaterial's occlusionMap property changes.

Event Payload:

  • value Object

    Number The property's new value

opacity

Fired whenever this MetallicMaterial's opacity property changes.

Event Payload:

  • value Number

    The property's new value

opacityMap

Fired whenever this MetallicMaterial's opacityMap property changes.

Event Payload:

  • value Object

    Number The property's new value

roughness

Fired whenever this MetallicMaterial's roughness property changes.

Event Payload:

  • value Number

    The property's new value

roughnessMap

Fired whenever this MetallicMaterial's roughnessMap property changes.

Event Payload:

  • value Object

    Number The property's new value

specularF0

Fired whenever this MetallicMaterial's specularF0 property changes.

Event Payload:

  • value Float32Array

    The property's new value