vpenades / SharpGLTF

glTF reader and writer for .NET Standard
MIT License
454 stars 72 forks source link

[Feature Request] Only material file #205

Closed AN3Orik closed 7 months ago

AN3Orik commented 7 months ago

Hello. Is it possible to create "material-only" GLTF file like a mentioned in this Issue https://github.com/KhronosGroup/glTF/issues/1420 via SharpGLTF API?

{
    "asset": {
        "version": "2.0",
    },
    "material": 0,
    "images": [
        {
            "uri": "base.jpg"
        }
    ],
    "samplers": [
        {
            "magFilter": 9729,
            "minFilter": 9985,
            "wrapS": 10497,
            "wrapT": 10497
        }
    ],
    "textures": [
        {
            "sampler": 0,
            "source": 0
        }
    ],
    "materials": [
        {
            "pbrMetallicRoughness": {
                "baseColorTexture" : {
                    "index" : 0,
                    "texCoord" : 0
                },
                "baseColorFactor": [1, 1, 1, 1],
                "metallicFactor": 1,
                "roughnessFactor": 1
            },
            "doubleSided": false,
            "name": "MyMaterial"
        }
    ]
}
vpenades commented 7 months ago

Theoretically it should be possible.

From a strict point of view, I think glTF specification discourages it because they consider glTF as the "jpg of 3D", so you could say that in a materials library only glTF. "there's nothing to view". But I don't think importers and exporters would complains much. At best you would simply have warnings when exporting/importing an empty scene.

Regarding https://github.com/KhronosGroup/glTF/issues/1420 , glTF spec does not support referencing external components, but it's something I would not dislike to have, not only for materials, but also for meshes and animations too.

But, right now, there's only two ways of doing it:

From the point of view of SharpGLTF, it would be not too difficult to import a scene, convert the materials to MaterialBuilders, and export them individually, but it could be even easier if you simply load the Json DOM and simply remove every node except Textures, Images, Materials and so on.

AN3Orik commented 7 months ago

Thanks for answer! I'm using currently SharpGLTF for creating from scratch some old materials from old game (UE2) to PBR-materials for importing to UE5, so variant with loading existing scene is not for me, unfortunately. Now I’m just deleting extra-nodes with JSON parser.

My proposal it's s let users adding MaterialBuilder to scene without creating meshes: something like a scene.AddMaterial(MaterialBuilder)

Btw gltf-validator successfully validating GLTF even with only one material node. And even more: Unreal engine 4/5 also importing this material to assets without problem. Ty for your time and have a good day!