diff --git a/documents/Specification/inprog_v1.39/MaterialX.PBRSpec.md b/documents/Specification/inprog_v1.39/MaterialX.PBRSpec.md
index 58138c8308..9a9fc7527a 100644
--- a/documents/Specification/inprog_v1.39/MaterialX.PBRSpec.md
+++ b/documents/Specification/inprog_v1.39/MaterialX.PBRSpec.md
@@ -37,7 +37,7 @@ This document describes a number of shader-semantic nodes implementing widely-us
[BSDF Nodes](#bsdf-nodes)
[EDF Nodes](#edf-nodes)
[VDF Nodes](#vdf-nodes)
- [Shader Nodes](#shader-nodes)
+ [PBR Shader Nodes](#pbr-shader-nodes)
[Utility Nodes](#utility-nodes)
**[Shading Model Examples](#shading-model-examples)**
@@ -303,7 +303,7 @@ The PBS nodes also make use of the following standard MaterialX types:
* `anisotropy` (float): Anisotropy factor, controlling the scattering direction, range [-1.0, 1.0]. Negative values give backwards scattering, positive values give forward scattering, and a value of 0.0 (the default) gives uniform scattering.
-## Shader Nodes
+## PBR Shader Nodes
@@ -334,6 +334,9 @@ The PBS nodes also make use of the following standard MaterialX types:
* `intensity` (color3): Intensity multiplier for the light's emittance. Defaults to (1.0, 1.0, 1.0).
* `exposure` (float): Exposure control for the light's emittance. Defaults to 0.0.
+Note that the standard library includes definitions for [**`displacement`**](./MaterialX.Specification.md#node-displacement) and [**`surface_unlit`**](./MaterialX.Specification.md#node-surfaceunlit) shader nodes.
+
+
## Utility Nodes
diff --git a/documents/Specification/inprog_v1.39/MaterialX.Specification.md b/documents/Specification/inprog_v1.39/MaterialX.Specification.md
index c0dc5c9b48..85d4bf2d94 100644
--- a/documents/Specification/inprog_v1.39/MaterialX.Specification.md
+++ b/documents/Specification/inprog_v1.39/MaterialX.Specification.md
@@ -64,7 +64,6 @@ This document describes the core MaterialX specification. Companion documents [
[Conditional Nodes](#conditional-nodes)
[Channel Nodes](#channel-nodes)
[Convolution Nodes](#convolution-nodes)
- [Shader Nodes](#shader-nodes)
[Standard Node Inputs](#standard-node-inputs)
[Standard UI Attributes](#standard-ui-attributes)
@@ -90,7 +89,7 @@ This document describes the core MaterialX specification. Companion documents [
[Example Custom Node Defined by a Nodegraph](#example-custom-node-defined-by-a-nodegraph)
[Custom Node Use](#custom-node-use)
[Shader Nodes](#shader-nodes)
- [Standard Shader-Semantic Operator Nodes](#standard-shader-semantic-operator-nodes)
+ [Standard Library Shader Nodes](#standard-library-shader-nodes)
[AOV Output Elements](#aov-output-elements)
[AOVOutput Example](#aovoutput-example)
[Material Nodes](#material-nodes)
@@ -618,13 +617,14 @@ Attributes for Output elements:
* `nodename` (string, optional): the name of a node at the same scope within the document, whose result value will be output. This attribute is required for <output> elements within a node graph, but is not allowed in <output> elements within a <nodedef>.
* `output` (string, optional): if the node specified by `nodename` has multiple outputs, the name of the specific output to connect this <output> to.
* `uniform` (boolean, optional): If set to "true", then the output of this node is treated as a uniform value, and this output may be connected to a uniform input of the same (or compatible) type. It is up to the application creating the nodegraph to ensure that the value actually is uniform. Default is "false".
+
+MaterialX also supports the following additional attributes for Output elements in applications which process node graphs in 2D space and save or cache outputs as images for efficiency, such as texture baking or image caching. These attributes do **not** affect values from this <output> connected to other nodes, e.g. they would remain in the working colorspace and retain full resolution and bitdepth precision.
+
* `colorspace` (string, optional): the name of the color space for the output image. Applications that support color space management are expected to perform the required transformations of output colors into this space.
* `width` (integer, optional): the expected width in pixels of the output image.
* `height` (integer, optional): the expected height in pixels of the output image.
* `bitdepth` (integer, optional): the expected per-channel bit depth of the output image, which may be used to capture expected color quantization effects. Common values for `bitdepth` are 8, 16, 32, and 64. It is up to the application to determine what the internal representation of any declared bit depth is (e.g. scaling factor, signed or unsigned, etc.).
-The `colorspace`, `width`, `height` and `bitdepth` attributes are intended to be used in applications which process node graphs in 2D space and save or cache outputs as images for efficiency.
-
## Standard Source Nodes
@@ -745,6 +745,15 @@ Standard Procedural nodes:
* `center` (float): a value representing the V-coordinate of the split; all pixels above "center" will be `valuet`, all pixels below "center" will be `valueb`. Default is 0.5.
* `texcoord` (vector2): the name of a vector2-type node specifying the 2D texture coordinate at which the split position is evaluated. Default is to use the first set of texture coordinates.
+
+
+* **`checkerboard`**: a 2D checkerboard pattern.
+ * `color1` (color3): The first color used in the checkerboard pattern.
+ * `color2` (color3): The second color used in the checkerboard pattern.
+ * `freq` (vector2): The frequency of checkers, with higher values producing smaller squares. Default is (8, 8).
+ * `offset` (vector2): Shift the pattern in 2d space. Default is (0, 0).
+ * `texcoord` (vector2): The input 2d space. Default is the first texture coordinates.
+
* **`noise2d`**: 2D Perlin noise in 1, 2, 3 or 4 channels.
@@ -887,6 +896,8 @@ Standard Geometric nodes:
* `geomprop` (uniform string): the geometric property to be referenced.
* `default` (same type as the geomprop's value): a value to return if the specified `geomprop` is not defined on the current geometry.
+Additionally, the `geomcolor`, `geompropvalue` and `geompropvalueuniform` nodes for color3/color4-type properties can take a `colorspace` attribute to declare what colorspace the color property value is in; the default is "none" for no colorspace declaration (and hence no colorspace conversion).
+
@@ -969,7 +980,7 @@ Operator nodes process one or more required input streams to form an output. Li
The inputs of compositing operators are called "fg" and "bg" (plus "alpha" for float and color3 variants, and "mix" for all variants of the `mix` operator), while the inputs of other operators are called "in" if there is exactly one input, or "in1", "in2" etc. if there are more than one input. If an implementation does not support a particular operator, it should pass through the "bg", "in" or "in1" input unchanged.
-This section defines the Operator Nodes that all MaterialX implementations are expected to support. Standard Operator Nodes are grouped into the following classifications: [Math Nodes](#math-nodes), [Adjustment Nodes](#adjustment-nodes), [Compositing Nodes](#compositing-nodes), [Conditional Nodes](#conditional-nodes), [Channel Nodes](#channel-nodes), [Convolution Nodes](#convolution-nodes) and [Shader Nodes](#shader-nodes).
+This section defines the Operator Nodes that all MaterialX implementations are expected to support. Standard Operator Nodes are grouped into the following classifications: [Math Nodes](#math-nodes), [Adjustment Nodes](#adjustment-nodes), [Compositing Nodes](#compositing-nodes), [Conditional Nodes](#conditional-nodes), [Channel Nodes](#channel-nodes) and [Convolution Nodes](#convolution-nodes).
@@ -980,7 +991,7 @@ Math nodes have one or two spatially-varying inputs, and are used to perform a m
-* **`add`**: add a value to the incoming float/color/vector/matrix. See also the [Shader Nodes](#shader-nodes) section below for additional `add` variants supporting shader-semantic types.
+* **`add`**: add a value to the incoming float/color/vector/matrix.
* `in1` (float or colorN or vectorN or matrixNN): the value or nodename for the primary input
* `in2` (same type as `in1` or float): the value or nodename to add; for matrix types, the default is the zero matrix.
@@ -992,7 +1003,7 @@ Math nodes have one or two spatially-varying inputs, and are used to perform a m
-* **`multiply`**: multiply an incoming float/color/vector/matrix by a value. Multiplication of two vectors is interpreted as a component-wise vector multiplication, while multiplication of two matrices is interpreted as a standard matrix product. To multiply a vector and a matrix, use one of the `transform*` nodes. See also the [Shader Nodes](#shader-nodes) section below for additional `multiply` variants supporting shader-semantic types.
+* **`multiply`**: multiply an incoming float/color/vector/matrix by a value. Multiplication of two vectors is interpreted as a component-wise vector multiplication, while multiplication of two matrices is interpreted as a standard matrix product. To multiply a vector and a matrix, use one of the `transform*` nodes.
* `in1` (float or colorN or vectorN or matrixNN): the value or nodename for the primary input
* `in2` (same type as `in1` or float): the value or nodename to multiply by; default is 1.0 in all channels for float/color/vector types, or the identity matrix for matrix types.
@@ -1020,17 +1031,17 @@ Math nodes have one or two spatially-varying inputs, and are used to perform a m
-* **`floor`**: the per-channel nearest integer value less than or equal to the incoming float/color/vector; the output remains in floating point per-channel, i.e. the same type as the input.
+* **`floor`**: the per-channel nearest integer value less than or equal to the incoming float/color/vector. The output remains in floating point per-channel, i.e. the same type as the input, except that the floor(float) also has a variant outputting an integer type.
* `in` (float or colorN or vectorN): the input value or nodename
-* **`ceil`**: the per-channel nearest integer value greater than or equal to the incoming float/color/vector; the output remains in floating point per-channel, i.e. the same type as the input.
+* **`ceil`**: the per-channel nearest integer value greater than or equal to the incoming float/color/vector. The output remains in floating point per-channel, i.e. the same type as the input, except that the ceil(float) also has a variant outputting an integer type.
* `in` (float or colorN or vectorN): the input value or nodename
-* **`round`**: round each channel of the incoming float/color/vector values to the nearest integer value, e.g "floor(in+0.5)".
+* **`round`**: round each channel of the incoming float/color/vector values to the nearest integer value, e.g "floor(in+0.5)"; the round(float) also has a variant outputting an integer type.
* `in` (float or colorN or vectorN): the input value or nodename
@@ -1131,6 +1142,13 @@ Math nodes have one or two spatially-varying inputs, and are used to perform a m
* **`magnitude`**: output the float magnitude (vector length) of the incoming vectorN stream; cannot be used on float or colorN streams. Note: the fourth channel in vector4 streams is not treated any differently, e.g. not as a homogeneous "w" value.
* `in` (vectorN): the input value or nodename
+
+
+
+* **`distance`**: Measures the distance between two points in 2D, 3D, or 4D.
+ * `in1` (vectorN): the first input value or nodename
+ * `in2` (same type as `in1`): the second input value or nodename
+
* **`dotproduct`**: output the (float) dot product of two incoming vectorN streams; cannot be used on float or colorN streams.
@@ -1364,7 +1382,7 @@ The Mix node takes two 1-4 channel inputs `fg` and `bg` plus a separate 1-channe
| **`mix`** | Fm+B(1-m) |
-See also the [Shader Nodes](#shader-nodes) section below for additional `mix` operator variants supporting shader-semantic types.
+See also the [Standard Library Shader Nodes](#standard-library-shader-nodes) section below for additional `mix` operator variants supporting shader-semantic types.
@@ -1400,7 +1418,7 @@ Conditional nodes are used to compare values of two streams, or to select a valu
* **`switch`**: output the value of one of up to ten input streams, according to the value of a selector input `which`. Switch nodes can be of output type float, colorN or vectorN, and have five inputs, in1 through in10 (not all of which must be connected), which must match the output type.
- * `in1`, `in2`, `in3`, `in4`, `in5`, `in6`, `in7`, `in8`, `in9`, `in10` (float or colorN or vectorN): the values or nodenames to select from based on the value of the `which` input. The types of the various `inN` inputs must match the type of the `switch` node itself. The default value of all `inN` inputs is 0.0 in all channels.
+ * `in1`, `in2`, `in3`, `in4`, `in5`, `in6`, `in7`, `in8`, `in9`, `in10` (float or colorN or vectorN): the values or nodenames to select from based on the value of the `which` input. The types of the various `in`N inputs must match the type of the `switch` node itself. The default value of all `in`N inputs is 0.0 in all channels.
* `which` (integer or float): a selector to choose which input to take values from; the output comes from input "floor(`which`)+1", clamped to the 1-10 range. So `which`<1 will pass on the value from in1, 1<=`which`<2 will pass the value from in2, 2<=`which`<3 will pass the value from in3, and so on up to 9<=`which` will pass the value from in10. The default value of `which` is 0.
@@ -1437,7 +1455,7 @@ Channel nodes are used to perform channel manipulations and data type conversion
-* **`combine2`**, **`combine3`**, **`combine4`**: combine the channels from two, three or four streams into the same total number of channels of a single output stream of a specified compatible type; please see the table below for a list of all supported combinations of input and output types. For color output types, no colorspace conversion will take place; the channels are simply copied as-is.
+* **`combine2`**, **`combine3`**, **`combine4`**: combine the channels from two, three or four streams into the same total number of channels of a single output stream of a specified compatible type; please see the table below for a list of all supported combinations of input and output types. For colorN output types, no colorspace conversion will take place; the channels are simply copied as-is.
* `in1` (float/color3/vector2/vector3): the input value or nodename which will be sent to the N channels of the output; default is 0.0 in all channels
* `in2` (float/vector2): the input value or nodename which will be sent to the next N channels of the output; default is 0.0 in all channels
* `in3` (float): for **`combine3`** or **`combine4`**, the input value or nodename which will be sent to the next channel of the output after `in2`; default is 0.0
@@ -1495,25 +1513,6 @@ Convolution nodes have one input named "in", and apply a defined convolution fun
-### Shader Nodes
-
-Shader nodes construct a shader (a node with a shader semantic output type) from the specified inputs, which may then be connected to a material. Standard library shaders do not respond to external illumination; please refer to the [**MaterialX Physically Based Shading Nodes**](./MaterialX.PBRSpec.md#materialx-pbs-library) document for definitions of additional nodes and shader constructors which do respond to illumination.
-
-
-
-
-* **`surface`**: Constructs a surface shader for an unlit surface with a plain unshaded color value. Useful for visualizing texture data or rendering non-PBR materials. Output type "surfaceshader".
- * `color` (color3): Color value to display. Default is (0, 0, 0).
- * `opacity` (float or color3): Cutout (float) or transmission (color3) opacity for the surface. Default is 1.0, representing a fully-opaque surface.
-
-
-
-* **`displacement`**: Constructs a displacement shader describing geometric modification to surfaces. Output type "displacementshader".
- * `displacement` (float or vector3): Scalar (along the surface normal direction) or vector displacement (in (dPdu, dPdv, N) tangent/normal space) for each position. Default is 0.
- * `scale` (float): Scale factor for the displacement vector. Default is 1.0.
-
-
-
## Standard Node Inputs
All standard nodes which define a `defaultinput` or `default` value support the following input:
@@ -2170,14 +2169,11 @@ An input with a shader-semantic type may be given a value of "" to indicate no s
-### Standard Shader-Semantic Operator Nodes
+### Standard Library Shader Nodes
-The Standard MaterialX Library defines the following nodes and node variants operating on "shader"-semantic types.
+The Standard MaterialX Library defines the following nodes and node variants operating on "shader"-semantic types. Standard library shaders do not respond to external illumination; please refer to the [**MaterialX Physically Based Shading Nodes**](./MaterialX.PBRSpec.md#materialx-pbs-library) document for definitions of additional nodes and shader constructors which do respond to illumination.
-* **`mix`**: linear blend between two surface/displacement/volumeshader closures.
- * `bg` (surface/displacement/volumeshader): the name of the background shader-semantic node
- * `fg` (surface/displacement/volumeshader): the name of the foreground shader-semantic node
- * `mix` (float): the blending factor used to mix the two input closures
+
* **`surface_unlit`**: an unlit surface shader node, representing a surface that can emit and transmit light, but does not receive illumination from light sources or other surfaces. Output type surfaceshader.
* `emission` (float): the surface emission amount; default is 1.0
@@ -2186,6 +2182,20 @@ The Standard MaterialX Library defines the following nodes and node variants ope
* `transmission_color` (color3): surface transmission color; default is (1, 1, 1)
* `opacity` (float): surface cutout opacity; default is 1.0
+
+
+* **`displacement`**: Constructs a displacement shader describing geometric modification to surfaces. Output type "displacementshader".
+ * `displacement` (float or vector3): Scalar (along the surface normal direction) or vector displacement (in (dPdu, dPdv, N) tangent/normal space) for each position. Default is 0.
+ * `scale` (float): Scale factor for the displacement vector. Default is 1.0.
+
+
+
+* **`mix`**: linear blend between two surface/displacement/volumeshader closures.
+ * `bg` (surface/displacement/volumeshader): the name of the background shader-semantic node
+ * `fg` (surface/displacement/volumeshader): the name of the foreground shader-semantic node
+ * `mix` (float): the blending factor used to mix the two input closures
+
+
### AOV Output Elements
diff --git a/documents/Specification/inprog_v1.39/MaterialX.Supplement.md b/documents/Specification/inprog_v1.39/MaterialX.Supplement.md
index 703fa1275c..5a1a8e7a55 100644
--- a/documents/Specification/inprog_v1.39/MaterialX.Supplement.md
+++ b/documents/Specification/inprog_v1.39/MaterialX.Supplement.md
@@ -84,6 +84,7 @@ This section describes a number of supplemental nodes for MaterialX. These node
* `default` (float or colorN or vectorN): a default value to use if any `fileX` reference can not be resolved (e.g. if a <geomtoken>, [interfacetoken] or {hostattr} is included in the filename but no substitution value or default is defined, or if the resolved file URI cannot be read) The `default` value must be the same type as the `` element itself. If `default` is not defined, the default color value will be 0.0 in all channels.
* `position` (vector3): a spatially-varying input specifying the 3D position at which the projection is evaluated. Default is to use the current 3D object-space coordinate.
* `normal` (vector3): a spatially-varying input specifying the 3D normal vector used for blending. Default is to use the current object-space surface normal.
+ * `blend` (float): a 0-1 weighting factor for blending the three axis samples using the geometric normal, with higher values giving softer blending. Default is 1.0.
* `filtertype` (uniform string): the type of texture filtering to use; standard values include "closest" (nearest-neighbor single-sample), "linear", and "cubic". If not specified, an application may use its own default texture filtering method.
```
@@ -160,12 +161,13 @@ This section describes a number of supplemental nodes for MaterialX. These node
* **`triplanarblend`**: samples data from three inputs, and projects a tiled representation of the images along each of the three respective coordinate axes, computing a weighted blend of the three samples using the geometric normal.
- * inx (float or colorN): the image to be projected in the direction from the +X axis back toward the origin. Default is 0 in all channels.
- * iny (float or colorN): the image to be projected in the direction from the +Y axis back toward the origin with the +X axis to the right. Default is 0 in all channels.
- * inz (float or colorN): the image to be projected in the direction from the +Z axis back toward the origin. Default is 0 in all channels.
- * position (vector3): a spatially-varying input specifying the 3D position at which the projection is evaluated. Default is to use the current 3D object-space coordinate.
- * normal (vector3): a spatially-varying input specifying the 3D normal vector used for blending. Default is to use the current object-space surface normal.
- * filtertype (uniform string): the type of texture filtering to use; standard values include "closest" (nearest-neighbor single-sample), "linear", and "cubic". If not specified, an application may use its own default texture filtering method.
+ * `inx` (float or colorN): the image to be projected in the direction from the +X axis back toward the origin. Default is 0 in all channels.
+ * `iny` (float or colorN): the image to be projected in the direction from the +Y axis back toward the origin with the +X axis to the right. Default is 0 in all channels.
+ * `inz` (float or colorN): the image to be projected in the direction from the +Z axis back toward the origin. Default is 0 in all channels.
+ * `position` (vector3): a spatially-varying input specifying the 3D position at which the projection is evaluated. Default is to use the current 3D object-space coordinate.
+ * `normal` (vector3): a spatially-varying input specifying the 3D normal vector used for blending. Default is to use the current object-space surface normal.
+ * `blend` (float): a 0-1 weighting factor for blending the three axis samples using the geometric normal, with higher values giving softer blending. Default is 1.0.
+ * `filtertype` (uniform string): the type of texture filtering to use; standard values include "closest" (nearest-neighbor single-sample), "linear", and "cubic". If not specified, an application may use its own default texture filtering method.
diff --git a/documents/Specification/inprog_v1.39/README_v1.39.md b/documents/Specification/inprog_v1.39/README_v1.39.md
index f63017ba9d..28e74e195b 100644
--- a/documents/Specification/inprog_v1.39/README_v1.39.md
+++ b/documents/Specification/inprog_v1.39/README_v1.39.md
@@ -33,7 +33,7 @@ Previously, MaterialX used custom types with a structure of output variables to
**Array Types Now Uniform and Static Length**
-Many shading languages do not support dynamic array types with a variable length, so MaterialX now only supports arrays with a fixed maximum length, and all array-type node inputs must be uniform; nodes are no longer permitted to output an array type. Array-type inputs may be accompanied by a uniform integer input declaring the number of array elements actually used in the array. Because of this change, the unimplemented <arrayappend> node has been removed.
+Many shading languages do not support dynamic array types with a variable length, so MaterialX now only supports arrays with a fixed maximum length, and all array-type node inputs must be uniform; nodes are no longer permitted to output an array type. Array-type inputs may be accompanied by a uniform integer input declaring the number of array elements actually used in the array (the <curveadjust> node has been updated in this way). Because of this change, the unimplemented <arrayappend> node has been removed.
**Connectable Uniform Inputs and New Tokenvalue Node**
@@ -62,7 +62,7 @@ The standard <swizzle> node using a string of channel names and allowing arbi
**New Unlit Surface Shader and Standard Materials**
-A new standard <surface> constructor node for unlit surfaces has been added to the standard library.
+A new <surface_unlit> node for unlit surfaces has been added to the standard library.
Additionally, the standard <surfacematerial> material now supports both single- or double-sided surfaces with the addition of a separate `backsurface` input.
@@ -72,13 +72,13 @@ Additionally, the standard <surfacematerial> material now supports both singl
Typedefs may now inherit from other types, including built-in types, and may provide hints about their values such as floating-point precision. These new "inherit" and "hint" attributes are themselves merely metadata hints about the types; applications and code generators are still expected to provide their own precise definitions for all custom types.
-**New Nodes**
+**New and Updated Standard Library Nodes**
-The following new standard operator nodes have been added:
+The following new operator nodes have been added to the standard library:
-* [Procedural nodes](./MaterialX.Specification.md#procedural-nodes): **tokenvalue**, **fractal2d**, **cellnoise1d**
+* [Procedural nodes](./MaterialX.Specification.md#procedural-nodes): **tokenvalue**, **checkerboard**, **fractal2d**, **cellnoise1d**
* [Geometric nodes](./MaterialX.Specification.md#geometric-nodes): **bump**, **geompropvalueuniform**
-* [Math nodes](./MaterialX.Specification.md#math-nodes): boolean **and**, **or**, **not**; **transformcolor**, **creatematrix**
+* [Math nodes](./MaterialX.Specification.md#math-nodes): boolean **and**, **or**, **not**; **distance**, **transformcolor** and **creatematrix**, as well as integer-output variants of **floor** and **ceil**
* [Adjustment nodes](./MaterialX.Specification.md#adjustment-nodes): **curveinversecubic**, **curveuniformlinear** and **curveuniformcubic**
* [Conditional nodes](./MaterialX.Specification.md#conditional-nodes): boolean-output variants of **ifgreater**, **ifgreatereq** and **ifequal**; new **ifelse** node
* [Channel nodes](./MaterialX.Specification.md#channel-nodes): **extractrowvector**
@@ -103,10 +103,13 @@ The following new standard physically based shading nodes have been added:
* The <member> element for <typedef>s and the "member" attribute for inputs have been removed from the Specification, as they had never been implemented and it was not clear how they could be implemented generally.
* The "valuerange" and "valuecurve" attributes describing expressions and function curves have been removed, in favor of using the new <curveinversecubic> / <curveuniformcubic> / etc. nodes.
+* The <geomcolor>, <geompropvalue> and <geompropvalueuniform> nodes for color3/4-type values can now take a "colorspace" attribute to declare the colorspace of the property value.
* The <cellnoise2d> and <cellnoise3d> nodes now support vectorN output types in addition to float output.
+* The <noise2d/3d>, <fractal2d/3d>, <cellnoise2d/3d> and <worleynoise2d/3d> nodes now support a "period" input.
* The <worleynoise2d> and <worleynoise3d> nodes now support a number of different distance metrics.
-* The <time> node no longer has a "frames per second" input: the application is now always expected to generate the "current time in seconds" using an appropriate method. "Fps" was removed because varible-rate real-time applications have no static "fps", and it's generally not good to bake a situation-dependent value like fps into a shading network.
+* The <time> node no longer has a "frames per second" input: the application is now always expected to generate the "current time in seconds" using an appropriate method. The "fps" input was removed because variable-rate real-time applications have no static "fps", and it's generally not good to bake a situation-dependent value like fps into a shading network.
* A standard "tangent" space is now defined in addition to "model", "object" and "world" spaces, and the <heighttonormal> node now accepts a uniform "space" input to define the space of the output normal vector.
+* The <switch> node now supports 10 inputs instead of just 5.
* The <surface> and <displacement> nodes are now part of the main Specification rather than being Physically Based Shading nodes.
* <Token> elements are now explicitly allowed to be children of compound nodegraphs, and token values may now have defined enum/enumvalues.
* Inputs in <nodedef>s may now supply "hints" to code generators as to their intended interpretation, e.g. "transparency" or "opacity".