Export material to MaterialX for Hydra render #111765

Manually merged
Brecht Van Lommel merged 48 commits from DagerD/blender:matx-export-material into main 2023-09-26 18:56:40 +02:00

48 Commits

Author SHA1 Message Date
Bogdan Nagirniak 29944bc2eb Merge branch 'main' into matx-export-material
buildbot/vexp-code-patch-coordinator Build done. Details
2023-09-26 17:19:07 +03:00
Bogdan Nagirniak 6e1775d516 Implement BSDF Transparent shader
### Purpose
Implement BSDF Transparent + include and shader's opacity to MatX nodetree.

### Technical steps
1. Added special type `NodeItem::Type::SurfaceOpacity` to retrieve opacity for \<surface> node.
2. Implemented export of BSDFTransparent node.
3. Implemented export of opacity component in BSDFPrincipled, Add/Mix shader nodes.
4. Removed redundant code.

### Notes
Storm and RPR hydra delegates aren't working good with opacity, this has to be fixed on delegate/hydra side, therefore those changes won't be visible. Opacity can be checked in MaterialXView or MaterialXGraphEditor of the exported mtlx.

Pull Request: DagerD/blender#36
2023-09-26 16:16:08 +02:00
Vasyl Pidhirskyi 2e741c6825 MaterialX: code improvements shader modes.
### Purpose
* Code improvements.
* Implemente Tangent Node.
* Glass shader is over-reflected, make Glass shader node utilize only `dielectric_bsdf` with Reflection and Transmission components (scatter = RT).
`"""dielectric_bsdf: A reflection/transmission BSDF node based on a microfacet model and a Fresnel curve for dielectrics."""`
* Sheen node `Roughness` input affects the node's effect.

### Technical Steps
* Code Improvements.
* Comments fixes.
* Implemented Tangent Node, using default `tangent` node.
* Glass shader node: removed mixing with `conductor_bsdf` node as far as `dielectric_bsdf` node already has a reflection component so `conductor_bsdf` seems redundant.
* Sheen node: removed `weight` input for `sheen_bsdf`, as far as it affects the node's effect.
* Renamed Displacementshader -> DisplacementShader.

Pull Request: DagerD/blender#35
2023-09-26 11:02:14 +02:00
Georgiy Markelov 2df0bc3670 MaterialX: code improvements
### Purpose
Code improvements

### Technical Steps
Comments fixes
`PrinsipleBSDF`: `subsurface_radius` type `Vector3` -> `Color3`

Pull Request: DagerD/blender#34
2023-09-26 07:28:40 +02:00
Brecht Van Lommel c2b5dfc2fe Update for renamed Principled BSDF sockets
buildbot/vexp-code-patch-coordinator Build done. Details
2023-09-25 20:36:48 +02:00
Brecht Van Lommel dec3f660e5 Merge branch 'main' into HEAD 2023-09-25 20:36:27 +02:00
Brecht Van Lommel cf762804bc Fix compiler errors and warnigs on Linux 2023-09-25 18:30:39 +02:00
Bogdan Nagirniak d10771b96c Code adjustments after merge
buildbot/vexp-code-patch-coordinator Build done. Details
2023-09-24 13:51:48 +03:00
Bogdan Nagirniak d2cda6eb35 Merge branch 'main' into matx-export-material 2023-09-24 12:46:57 +03:00
Bogdan Nagirniak f508aca747 Merge branch 'main' into matx-export-material 2023-09-24 08:49:55 +03:00
Bogdan Nagirniak 1132957f48 Fix linux build
### Purpose
Errors in linux build https://builder.blender.org/admin/#/builders/132/builds/2398. Issues in group nodes.

### Technical steps
1. Fixed linux build: set math functions names to convenience.
2. Fixed some issues in group nodes. Made better naming of inputs and outputs in `nodegraph` for group node.
3. `make format`

Co-authored-by: Vasyl-Pidhirskyi <vpidhirskyi@gmail.com>
Pull Request: DagerD/blender#33
2023-09-24 07:42:09 +02:00
Vasyl Pidhirskyi 2e5b34b6ae MaterialX: Fix group nodes.
### Purpose
#111765 (comment)
* In the default startup .blend, putting the Principled BSDF node in a group doesn't seem to work here. The cube renders white instead of the specified base color.
* The shader/node_group_color.blend renders white when it should be green, ignoring the color set on the group.

### Technical steps
* Specified `to_type_` for `GroupOutputNodeParser`.
* Improved `GroupInputNodeParser::compute()`.
* Improved `GroupOutputNodeParser::compute()`.

Pull Request: DagerD/blender#32
2023-09-22 18:37:29 +02:00
Bogdan Nagirniak 483728b704 Code improvements + Mix node
### Purpose
After last merged PRs some code has to be improved. Implement Mix node.

### Technical steps
1. Improvements in NodeItem:
    - `blend()` -> `mix()` + shaders + mix node usage
    - `extract()` -> `operator[]`
    - implemented `length()`, `to_vector()`, `normalize()`, `rotate()`, fixed `dotproduct()`
    - improvements in math functions.
2. Implemented node Mix
3. Improved code in BSDFPrincipled, TexWave, TexGradient, Mapping, VectorRotate.
4. Code adjustments.
5. Fixed/added comments.
6. Changed order of getting shader type in MaterialOutput: SurfaceShader starts first. Adjusted Add, Mix shaders.

Pull Request: DagerD/blender#30
2023-09-22 18:22:58 +02:00
Georgiy Markelov d1492f8592 MaterialX: make caching image in MaterialX independent from `bf_usd` project
### Purpose
Make caching image in MaterialX independent from `bf_usd` project

### Technical steps
* Added callback `ExportImageFunction` for image caching
* Removed `WITH_HYDRA` from CMakeLists

Pull Request: DagerD/blender#31
2023-09-22 18:12:38 +02:00
Vasyl Pidhirskyi 74afa9c393 MaterialX: add support for Vector nodes
### Purpose
Add support for Vector nodes.

### Technical steps
Fixed normal map color input type to Vector3.
Implemented NodeItem method rotate3d.
Implemented nodes

Added:
* Bump
* Mapping
* Normal
* Vector Rotate
* Vector Transform

Partially implemented (only node implementation):
* Vector Displacement
* Displacement

Not implemented:
* Vector Curves

Pull Request: DagerD/blender#27
2023-09-22 10:03:22 +02:00
Vasyl Pidhirskyi 6bd07ef717 MaterialX: Implement Wave Texture node.
### Purpose
Add support for Wave Texture node.

### Technical steps
Implemented Wave Texture node according to existing Blender's implementation.
Utilizing MaterialX "fractal3d" noise instead of Blender's "perlin_fractal" implementation. Adjusted parameter to get results close to Cycles/Eevee.

Pull Request: DagerD/blender#29
2023-09-21 11:25:59 +02:00
Georgiy Markelov 2973df8ea7 MaterialX: split standard_surface into basic nodes
### Purpose
Split standard_surface into basic nodes

### Technical steps
Standard_surface splitted into basic nodes

Pull Request: DagerD/blender#26
2023-09-21 10:58:04 +02:00
Vasyl Pidhirskyi 886b414a7c MaterialX: Implement Gradient Texture node.
### Purpose
Add support for Gradient Texture node.

### Technical steps
Implemented Gradient Texture node according to existing Blender's implementation,
Fixed dotproduct, added `to_type` argument to be able to specify output type of node while using `arithmetic` method.

Pull Request: DagerD/blender#28
2023-09-21 09:30:59 +02:00
Bogdan Nagirniak 2f980a9856 matx-extend-create_node
buildbot/vexp-code-patch-coordinator Build done. Details
### Purpose
Add parameter `inputs` to `NodeItem::create_node()` and simplify node creation in export implementation.

### Technical steps
Added type `NodeItem::Inputs`
Added parameter `inputs` to `NodeItem::create_node()`.
Updated node export implementation with new functionality.

Pull Request: DagerD/blender#25
2023-09-19 18:27:49 +02:00
Bogdan Nagirniak 1bafc3518a Fix creating 2 <image> nodes in TexImage when Color and Output are connected
### Purpose
TexImage node creates 2 <image> nodes when Color and Output are connected.

### Technical steps
Added name to <image> node, same as node_name with Color output.
Added implementation of TexEnvironment node.
Fixed naming in group_nodes.cc

Pull Request: DagerD/blender#24
2023-09-19 18:12:33 +02:00
Bogdan Nagirniak 412b40266f Support group nodes
### Purpose
Group nodes should be supported.

### Technical steps
1. Created classes `GroupNodeParser`, `GroupOutputNodeParser`, `GroupInputNodeParser` in `materialx/group_nodes.cc/.h`.
2. Added support of `NodeItem::input`, `NodeItem::output`.
3. Added control to use `<nodegraph>` by `#define USE_MATERIALX_NODEGRAPH`. Disabled by default because `pxr::UsdMtlxRead()` doesn't perform nodegraphs.
4. Added logging of `stage->ExportToString()` after `pxr::UsdMtlxRead()`.
5. Improvement in `node_shader_tex_noise.cc`.

Pull Request: DagerD/blender#22
2023-09-18 12:48:56 +02:00
Georgiy Markelov f6e00155f9 MaterialX: Implement more shader nodes
### Purpose
Implement more shader nodes

### Technical steps
Added type: `NodeItem::Type::multioutput`
Added nodes:
* Glossy BSDF
* Glass BSDF
* Refraction BSDF

Pull Request: DagerD/blender#23
2023-09-15 20:10:51 +02:00
Vasyl Pidhirskyi 3cdecebaf0 MaterialX: Implement export of Input nodes
### Purpose
Add support for Input nodes.

### Technical steps
Implemented get_value_default, get_output_default.
Fixed type conversion issue. Now type is converted even if a node is already in the graph.

Added:
* RGB
* Value

Partially implemented:
* Geometry
* Object Info
* Texture Coordinate
* UVMap
* Color Attribute
* Wireframe

Not implemented:
* Ambient Occlusion
* Attribute
* Bevel
* Camera Data
* Fresnel
* Curves Info
* Layer Weight
* Particle Info
* Point Info
* Tangent

Pull Request: DagerD/blender#20
2023-09-15 19:55:14 +02:00
Georgiy Markelov cbc1e652ab MaterialX: add shader nodes
### Purpose
Add shader nodes

### Technical steps
Added nodes:
* TranslucentBSDF
* Subsurface scattering
* SheenBSDF

Pull Request: DagerD/blender#21
2023-09-14 16:54:53 +02:00
Bogdan Nagirniak 1bc2f5c125 Adjusted BSDFPrincipled 2023-09-14 05:29:20 +03:00
Bogdan Nagirniak f931fbc87c Merge branch 'main' into matx-export-material 2023-09-14 03:08:16 +03:00
Georgiy Markelov 9b836a944b MaterialX: fix review comments
### Purpose
Fix review comments

### Technical steps
* Added comments
* fixed includes
* added ifdefs

Pull Request: DagerD/blender#19
2023-09-14 02:00:40 +02:00
Bogdan Nagirniak 9e483eace3 Move the MaterialX export code into the existing shader node files
### Purpose
Due to review suggestions, MaterialX export code should be moved to existing node files.

### Technical steps
1. Added `bNodeType::materialx_fn` function pointer.
2. Created special macroses `NODE_SHADER_MATERIALX_BEGIN`, `NODE_SHADER_MATERIALX_END` for including MaterialX export code into `node_shader_<name>.cc` files.
3. Removed `ShaderNodeParser` as not needed, just `NodeParser` can be used. Adjusted `get_input_link()` to work with shader types. Made `get_input_link()` to call `materialx_fn`.
4. Moved `node_parser.cc/.h`, `node_item.cc/.h` to `materialx` folder.
5. Moved MaterialX node export implementation to corresponded `node_shader_<name>.cc` files. Removed `materialx/nodes/...` files.
6. Created `DefaultMaterialNodeParser` in `material.cc`.

Pull Request: DagerD/blender#18
2023-09-12 13:55:04 +02:00
Georgiy Markelov 14ab54453f MaterialX: add color nodes
### Purpose
Add support for Color nodes

### Technical steps
Added:
* Gamma

Partially implemented:
* Light Falloff
* Light Path

Not implemented:
* Color Ramp
* Curves Float
* Curves RGB
* Wavelength

Pull Request: #17
2023-09-11 18:56:45 +02:00
Bogdan Nagirniak fd4d102601 Merge branch 'main' into matx-export-material 2023-09-08 19:30:37 +03:00
Bogdan Nagirniak 5e633f64e9 Export other channels and parameters from texture nodes
### Purpose
Texture nodes has basic implementation without additional parameters and channels.

### Technical steps
1. Simplified and added `Fac` channel to TexChecker node
2. Fixed TexImage and TexEnvironment nodes: support alpha output, added params, image checking, TODOs.
3. Fix in Math node: moved to Float type.
4. Moved texture nodes to Color4.

Pull Request: DagerD/blender#16
2023-09-08 18:28:36 +02:00
Georgiy Markelov 956df4e4db MaterialX: add convert nodes
### Purpose:
Add support for convert nodes

### Technical steps:
Added nodes:
* clamp
* RGB to BW
* Blackbody
* Map Range

Pull Request: DagerD/blender#15
2023-09-08 16:54:42 +02:00
Georgiy Markelov a610ec2ba3 Parsing Improvements
### Purpose
Perform parsing Improvements

### Technical steps
* Added `NodeItem::create_node()`
* Added `NodeItem::set_input_output()`
* Removed `NodeItem::set_input()` with `out_name` parameter
* `NodeParser::create_node()`: changed type to `NodeItem::Type`
* Logging improvements
* `NodeParser::value()` -> `NodeParser::val()`
* Renamings and code improvements

Pull Request: DagerD/blender#14
2023-09-07 15:10:04 +02:00
Bogdan Nagirniak a464b5854e Implement export of Shader BSDF nodes
### Purpose
Shader nodes has to be implemented. Adjust parsing system for export shaders.

### Technical steps
1. Added supported shader types to `NodeItem::Type`, added `Type::Any`, added comments.
2. Created `class ShaderNodeParser` special for parse shaders.
3. Added type conversion to `get_input_link()` and `get_input_default()`.
4. Added file templates for export new shaders. Implemented `AddShader`, `BSDFDiffuse`, `Emission`, `MixShader`.
5. Improved TexChecker using arithmetic functions.

### Notes
Other shaders aren't implemented, added TODOs. They'll be implemented in next PRs.

Pull Request: DagerD/blender#13
2023-09-07 11:22:22 +02:00
Georgiy Markelov e34ad47504 MaterialX: Move NodeItem::Type argument from setters to getters
### Purpose
Move NodeItem::Type argument from setters to getters

### Technical steps
Moved NodeItem::Type argument from setters to getters

Pull Request:DagerD/blender#12
2023-09-06 16:01:16 +02:00
Georgiy Markelov bbc3b2614a MaterialX: add support for nodes
### Purpose
Add support for more nodes
### Technical steps
Added support for:
* Separate, Combine XYZ
* Separate, Combine Color
* Vector Math (not all operations)
* Hue/Saturation/Value
* Normal Map
* Brightness/Contrast

Implemented `NodeItem::extract()`
Fixed BSDF Principled node

Pull Request: DagerD/blender#11
2023-09-06 10:37:15 +02:00
Bogdan Nagirniak 127fff6108 Implement type conversion for NodeItem
### Purpose
`NodeItem` requires `convert()` method for node type conversion. This will simplify arithmetic and other methods.

### Technical steps
1. Moved `NodeItem` type` and conditional type` in `if_else` from `string` to `enum` values.
2. Implemented `NodeItem::convert()` method.
3. Simplified `set_input` methods.
4. Refactor: rearranged functions in `NodeItem` to satisfy blender code style.

Pull Request: DagerD/blender#9
2023-09-05 12:03:02 +02:00
Bogdan Nagirniak e1248d2f28 Code improvements/fixes
### Purpose
There is set of code improvements and bug fixes required in NodeParser system.

### Technical steps
1. Separated `OutputMaterialNodeParser` declaration to `output_material.h`. Added more functionality.
2. Added `NodeParser::compute_full()` with additional logging and naming of mx_node.
3. Fix: added check if node was already computed.
4. Fixed TexChecker.
5. Code improvements, renamings, code cleanup.

### Notes
There is no need additional scaling in TexChecker, it was removed. There is issue with UV map on default cube, which should be fixed another way.

Pull Request: DagerD/blender#8
2023-09-04 10:09:46 +02:00
Bogdan Nagirniak d2dab8da23 Merge branch 'main' into matx-export-material 2023-08-31 23:05:51 +03:00
Bogdan Nagirniak fa0aea502f MaterialX logging
### Purpose
Change debug printf to CLOG logger. Add other logging.

### Technical steps
1. Applied CLOG logger to `bf_nodes_shader` project.
2. Changed debug `printf` to logging. Added other logging.
3. Fixed "Use MaterialX" in `rna_render.cc`.

### Notes
Don't use `--log-show-basename` blender running flag in Windows, because of clog crash due to incorrect path separator for `bf_nodes_shader` project.

Pull Request: DagerD/blender#7
2023-08-31 20:11:06 +02:00
Georgiy Markelov 4dfb0c5857 Export to MatX various Texture nodes
### Purpose
Add support for various Texture nodes.

### Technical steps
Added support for:
* Checker Texture
* Noise Texture
Extended NodeItem::set_input() by adding output_name. Added NodeItem::add_output()

### Notes
Environment Texture. `Projection` property is not supported for now.

Co-authored-by: Bogdan Nagirniak <bodyan@gmail.com>
Pull Request: DagerD/blender#5
2023-08-31 19:49:15 +02:00
Bogdan Nagirniak 6e49ba3d76 Implement export of Math node. Continue other arithmetic support for NodeItem
### Purpose
Continuing implementation of arithmetic functions for `NodeItem`. Implement Math node.

### Technical steps
1. Separated implementation of `NodeItem` and `NodeParser` to separate files.
2. Added more functions to `NodeItem`.
3. Implemented Blender Math node.

### Notes
Some operations from Math node aren't implemented. Probably will be done in separate task.

Pull Request: DagerD/blender#6
2023-08-31 12:35:33 +02:00
Bogdan Nagirniak 2a2c90226f Arithmetic support for NodeItem and node implementation with arithmetic
### Purpose
NodeItem requires arithmetic functions for export implementation of blender nodes.

### Technical steps
1. Added basic arithmetic functions to `NodeItem`.
2. Added some math nodes: `InvertNodeParser`, `MathNodeParser`, `MixRGBNodeParser`.
3. Improved parser declaration: added `DECLARE_PARSER` macros.

### Note
Only `InvertNodeParser` is implemented. `MathNodeParser`, `MixRGBNodeParser` are in TODOs.

Pull Request: DagerD/blender#4
2023-08-29 09:25:57 +02:00
Vasyl Pidhirskyi c5b48921bf Create parsing system that converts supported nodes and ignores unsupported
Implemented node export system: created `class NodeParser` and `class NodeItem`.

Co-authored-by: Bogdan Nagirniak <bodyan@gmail.com>
Pull Request: DagerD/blender#2
2023-08-28 12:29:24 +02:00
Georgiy Markelov 6822cfe948 Add bl_use_materialx property
### Purpose
Add `bl_use_materialx` to `RenderEngine`. MaterialX is utilized for exporting materials to Hydra.

### Technical steps
Added property `bl_use_materialx` to `RenderEngine`.

Co-authored-by: Vasyl-Pidhirskyi <vpidhirskyi@gmail.com>
Pull Request: DagerD/blender#3
2023-08-24 15:51:33 +02:00
Georgiy Markelov 5381d2d75b Merge branch 'main' into matx-export-material 2023-08-24 15:21:12 +03:00
Georgiy Markelov b89fb0785e Add basic supported nodes
### Purpose
Add basic supported nodes: `Material output`, `Principled BSDF`, `Image Texture`.

### Technical steps
* Added base class `MaterialXNode` for all MatX nodes
* Added basic supported nodes: `Material output`, `Principled BSDF`, `Image Texture`
* Added function `export_nodegraph`
* Fix typo

Pull Request: DagerD/blender#1
2023-08-24 10:22:40 +02:00
Georgiy Markelov 1c3aa08b55 MaterialX: added default material export 2023-08-17 16:34:42 +03:00