diff --git a/extensions/2.0/Khronos/KHR_texture_procedurals/README.md b/extensions/2.0/Khronos/KHR_texture_procedurals/README.md
index 64d5fcd1fb..fe1a57029f 100644
--- a/extensions/2.0/Khronos/KHR_texture_procedurals/README.md
+++ b/extensions/2.0/Khronos/KHR_texture_procedurals/README.md
@@ -2,14 +2,20 @@
## Contributors
-To fill in...
+- Ashwin Bhat, Autodesk, ashwin.bhat@autodesk.com
+- Alexey Knyazev, Individual Contributor, [@lexaknyazev](https://github.com/lexaknyazev)
+- Bernard Kwok, Individual Contributor, [@kwokcb](https://github.com/kwokcb)
+- Ed Mackey, AGI, [@emackey](https://twitter.com/emackey)
+- Lutz Kettner, NVIDIA, lkettner@nvidia.com
+- Richard Sahlin, IKEA [@rsahlin](https://github.com/rsahlin)
+- Timothy Blut, NVIDIA, tblut@nvidia.com
Copyright 2024 The Khronos Group Inc.
See [Appendix](#appendix-full-khronos-copyright-statement) for full Khronos Copyright Statement.
## Status
-To fill in...
+Draft
## Dependencies
@@ -18,20 +24,514 @@ Written against the glTF 2.0 spec.
## Overview
This extension provides a standardized way to represent
-procedural graphs which can be mapped to materials in glTF.
+procedural graphs which can be mapped to material channels in glTF.
### Motivation
-To fill in...
-## Schema
+Textures represented as procedural graphs provides a way to extend the capabilities of glTF materials beyond what is possible with traditional texture maps. Key objectives includes:
+
+1. **Interoperability**: Adhere to an industry a standard node schema (MaterialX) with a runtime friendly JSON representation.
+
+ More specifically __only__ nodes defined in the MaterialX specification are supported. This ensures that the procedural graphs can be easily converted to MaterialX and USDShade graphs.
+
+ For the first version of this extension nodes which are used to define shading models are not allowed. Please refer to the [resources](#resources) section for links to supported MaterialX node definitions.
+
+2. **Fidelity**: Provide the ability to generate complex patterns, noise, or other effects that are currently must be "baked" into texture maps. Reduce in runtime memory usage by generating textures programmatically.
+
+3. **Editability and Extensibility**: Extend runtime editability by exposing logic and interfaces for procedural graphs as well as providing a means to create new or extend existing node definitions.
+
+4. **Validity**: Ensure that procedurals graphs can be validated both against a schema as well as against reference rendering implementations.
+
+| Original | Baked |
+| :---: | :---: |
+| | |
+
+Example of fully procedural vs baked marble texture
+
+### Definitions
+
+The following is a set of definitions using MaterialX nomenclature to provide context for the procedural graph representation.
+
+* A **Node** is a function that generates or operates upon spatially-varying data. The MaterialX specification provides the set of standard nodes with precise definitions and also supports the creation of custom nodes.
+
+* **Node Input and Output Ports** The interface for a node’s incoming data is declared through **input ports**, which may be spatially-varying or uniform. The interface for a node’s outgoing data is declared through **output ports**.
+
+* There is a specific set of supported **Data Types**. Every port must have a data type.
+
+* A **Pattern** is a node that generates or processes simple scalar, vector, and color data, and has access to local properties of any geometry that has been bound to a given material.
+
+* A **Node Graph** is a directed acyclic graph (DAG) of nodes, which may be used to define arbitrarily complex generation or processing networks. Node Graphs describe a network of "pattern" nodes flowing into shader inputs, or to define a complex or layered node in terms of simpler nodes. The former is called a **compound nodegraph** and the latter a **functional nodegraph**.
+
+* A Node Graphs's:
+ * **Inputs** are nodes that define the interface for a node graph’s incoming data.
+ * **Outputs** are nodes that define the interface for a node graph’s outgoing data.
+
+* A **Node Definition** is a specification for a unique function with a given set of input and output ports. The logic for each functions is represented either as a `functional graph` or as shader code.
+
+## Extension Declaration
+
+To use the extension the `KHR_texture_procedurals` extension identifier must be added to the `extensionsUsed` array in the asset object.
+
+```json
+{
+ "extensionsUsed": [
+ "KHR_texture_procedurals"
+ ]
+}
+```
+with the extension object defined as follows:
+
+```json
+{
+ "extensions": {
+ "KHR_texture_procedurals": {
+ "mimetype": "application/mtlx+json;version=",
+ "procedurals": []
+ }
+ }
+}
+```
+It is assumed that a mimetype is always required. As part of the mimetype a version `` is specified. This is the version of the MaterialX library specification used when writing to glTF. The version is specified as a string in the form of `.`. For example, if the MaterialX library version is 1.39, the mimetype would be `application/mtlx+json;version=1.39`.
+
+This corresponds to the following XML element in MaterialX:
+
+```xml
+
+
+```
+
+The version in the mimetype __is not__ the extension version. If in the future the schema needs to be modified (perhaps due to changes in MaterialX) then a new extension version would be required.
+
+The `procedurals` array specifies the procedural graphs that are used in the glTF asset.
+
+## Representation
+
+For all applicable JSON objects, any / all supported MaterialX meta-data information may be specified. This includes information such as UI hints, node placement, and documentation, colorspace, and real world units to support interoperability or editability.
+
+Information which is used for resolving input data identifiers is not supported. For example specification of a `fileprefix` at the graph level is not supported.
+
+Tooling is expected to pre-resolve all resource identifiers for images and streams appropriately.
+
+### Data Types
+
+The supported data types are:
+
+* single `float`
+* single `integer`
+* tuples:
+ * `color3`, `color4` : 3 and 4 channel color
+ * `vector2`, `vector3`, `vector4` : 2, 3, 4 channel float vector
+ * `integer2`, `integer3`, `integer4` : 2, 3, 4 channel integer vector
+* matrix:
+ * `matrix3x3`, and `matrix4x4` : Matrices of floats of size 3 or 4.
+
+Tuples and matrices are represented as arrays of values. For example, a `color3` is represented as an array of 3 floats.
+
+### Procedural Graphs
+
+One ore more procedurals graphs can be defined in the `procedurals` array.
+
+A graph __cannot__ be nested (contain another graph), as is allowed for *OpenUSD* for instance. Any such configurations must be “flattened” to single level graphs. ( As MaterialX does not support nested graphs OpenUSD utilities perform flattening upon conversion to MaterialX. )
+
+Each procedural graph object is composed of:
+
+ * An optional string `name` identifier
+ * A `nodetype` which must be `nodegraph`
+ * A `type` which is the output type of the graph. This is a supported data type, or `multioutput` if there is more than one output node for the graph.
+ * A set of children nodes:
+ * `inputs` input "interface" nodes for passing data into the graph.
+ * `outputs` output "interface" nodes for passing data out of the graph. See [Node Graph Connections](#node-graph-connections) for connection information.
+ * `nodes` processing nodes.
+
+The structure of atomic nodes is described in ["Procedural" Nodes](#procedural-nodes) section.
+
+Note that input and output node types are `input` and `output` respectively.
+
+#### Procedural Graph Object
+
+```JSON
+{
+ name": "my_procedural",
+ "nodetype": "nodegraph",
+ "type": "",
+ "inputs": [...list of input nodes...],
+ "outputs": [...list of output nodes...],
+ "nodes": [...List of processing nodes...],
+}
+```
+
+### "Procedural" Nodes
+
+* An atomic function is represented as a single node with the following properties:
+
+ * An optional string `name` identifier
+
+ * A `nodetype` which is a string identifier for the node type. This is a MaterialX node type or a custom node type.
+
+ * A `type` which is the output type of the node. This is a supported data type or `multioutput` if there is more than one output port on a node.
+
+ * A list of input ports under an `inputs` array.
+ If an input is specified it's input value overrides that of the node definition default.
+ * A list of output ports under an `outputs` array. Every output port defined for the corresponding node definition must be specified.
+
+ - Each input port:
+ * Must have a node type: `input` for input ports and `output` for output ports.
+ * May have an optional string name identifier
+ * Must have a type which is a supported data type.
+ * Either:
+ * A `value` which is a constant value for the node. or
+ * A connection. See [Node Graph Connections](#node-graph-connections) for more information.
+ * An `input` which is a reference to another node in the graph. This is only valid for `output` nodes.
+ * All `output` ports specified on a node’s corresponding definition must be specified for each node instance. Each output port:
+ * Must have a node type: `output`
+ * Must have a type which is a supported data type.
+
+
+#### Procedural Graph Node
+
+```JSON
+{
+ "name": "",
+ "nodetype": "",
+ "type": "",
+ "inputs": [...optional list of input ports...],
+ "outputs": [...required list of output ports...]
+}
+```
+Where an input port has the following structure:
+```JSON
+{
+ "name": "",
+ "nodetype": "input",
+ "type": "",
+ "value": or
+ "node": or
+ "input":
+ "output":