Skip to main content
Glama

Generate PBR maps from an image

material_from_image

Turn ONE uploaded image (e.g. a logo PNG) into a full PBR material — deterministic, no AI. A mask (alpha channel, or bright/dark regions) drives derived roughness (baseRoughness/maskRoughness), embossed normal + height maps, optional metallic, and a base color composited over baseColor. Commits a new revision with the material (applyToObjects assigns it); maps pack into the .blend. Generated maps cap at 2048px on the longest edge — for full-resolution label/print work (4K macro shots), embed the original texture in a GLB and import via asset_import. Flow: upload_create → PUT → upload_complete → material_from_image. Returns a durable job handle. Explicit profile=surface/decal/supplied opts into the version-2 downloadable map workflow with roles and options; legacy mask/emboss arguments apply only when profile is omitted. Decals preserve transparency without implicit relief or metallic.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
rolesNo
embossNo
assetIdYes
optionsNo
profileNo
baseColorNo
projectIdYesStable project ID returned by project_create or projects_list.
maskSourceNoalpha
baseMetallicNo
maskMetallicNo
materialNameNoImage Material
baseRoughnessNo
maskRoughnessNo
applyToObjectsNo
baseRevisionIdNo"HEAD" (default) targets the project's current head. Mutations MUST build on the head: passing an older revision is rejected with REVISION_CONFLICT, since history is linear. To continue from an older scene, revision_restore it forward first.HEAD
idempotencyKeyYesStable caller-chosen key for safe retries of this same request.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
jobYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changed
    • addedInput schema / properties / options / properties / alphaCutoff / description
      Added value: +"Mask-mode alpha threshold, 0-1; default 0.5. Ignored by opaque/blend modes."
    • addedInput schema / properties / options / properties / alphaMode / description
      Added value: +"Material opacity behavior. Default opaque, or blend for decal profile; delivered PNG alpha is preserved regardless."
    • addedInput schema / properties / options / properties / displacementMode / description
      Added value: +"How the material uses height: none (default), shader bump, or displacement. A height map must be available; renderer/export support varies."
    • addedInput schema / properties / options / properties / emissionStrength / description
      Added value: +"Material emission multiplier, 0-10000; default 1 when emission is requested, otherwise 0. Requires an emission output to light the material."
    • addedInput schema / properties / options / properties / heightMidlevel / description
      Added value: +"Height value representing zero displacement, 0-1; default 0.5."
    • addedInput schema / properties / options / properties / heightScale / description
      Added value: +"Relief height in meters, 0-1; default 0.001. Used for height-derived normals and material bump/displacement."
    • addedInput schema / properties / options / properties / heightSource / description
      Added value: +"If no height map is supplied, explicitly allow height estimation from base_color luminance or alpha. Default none; estimated relief is labeled heuristic."
    • addedInput schema / properties / options / properties / maxSize / description
      Added value: +"Maximum output side in pixels, 8-4096; default 2048. Sources are aligned at their common aspect ratio without upscaling."
    • addedInput schema / properties / options / properties / metallic / description
      Added value: +"Constant metallic fallback, 0-1; default 0. Supplied metallic maps take precedence; brightness does not establish metalness."
    • addedInput schema / properties / options / properties / normalConvention / description
      Added value: +"Convention of supplied normal maps: OpenGL +Y (default) or DirectX -Y. A change to output convention flips the green channel."
    • addedInput schema / properties / options / properties / normalStrength / description
      Added value: +"Normal intensity multiplier, 0-16; default 1. Applied when converting supplied vectors or deriving normals from height."
    • addedInput schema / properties / options / properties / outputNormalConvention / description
      Added value: +"Convention for delivered normal maps, OpenGL +Y by default or DirectX -Y; the Blender material compensates for the output convention."
    • addedInput schema / properties / options / properties / packing / description
      Added value: +"Optional extra packed PNG: ORM uses red=ambient occlusion, green=roughness, blue=metallic; default none. Missing AO uses a documented white fallback."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / description
      Added value: +"Real dimensions of one UV tile for height-to-normal scaling. If omitted, derived relief normals assume a one-meter UV square."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / properties / height / description
      Added value: +"Physical height in meters represented by one complete texture tile; positive, at most 100000."
    • addedInput schema / properties / options / properties / physicalCoverageMeters / properties / width / description
      Added value: +"Physical width in meters represented by one complete texture tile; positive, at most 100000."
    • addedInput schema / properties / options / properties / roughness / description
      Added value: +"Constant roughness fallback, 0-1; default 0.65. A supplied roughness map or converted gloss map takes precedence."
    • addedInput schema / properties / options / properties / roughnessMode / description
      Added value: +"Fallback roughness generation: constant (default) or an explicitly requested base_color brightness estimate. Image-derived roughness is heuristic, not measured."
    • addedInput schema / properties / options / properties / roughnessRange / description
      Added value: +"[minimum, maximum] roughness for image estimates, increasing within 0-1; default [0.35, 0.85]."
    • addedInput schema / properties / options / properties / seamMode / description
      Added value: +"Analyze edges only (default) or blend edge pixels along tile axes. Blending changes imagery and may cause ghosting; inspect the repeat preview."
    • addedInput schema / properties / options / properties / specular / description
      Added value: +"Constant specular fallback, 0-1; default 0.5. Supplied specular maps take precedence."
    • addedInput schema / properties / options / properties / tile / description
      Added value: +"Texture axes to treat as periodic for relief and seam handling; default none. Does not guarantee perceptually seamless repetition."
    • addedInput schema / properties / roles / items / description
      Added value: +"Semantic map role; use one source per role. Color maps and scalar/vector data maps are interpreted differently."
  2. Changed8 schema fields changed
    • addedInput schema / properties / baseColor / items
      Added value: +{
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / baseColor / maxItems
      Added value: +4
    • addedInput schema / properties / baseColor / minItems
      Added value: +4
    • removedInput schema / properties / baseColor / prefixItems
      Removed value: -[
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  }
      -]
    • addedInput schema / properties / options / properties / roughnessRange / items
      Added value: +{
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / options / properties / roughnessRange / maxItems
      Added value: +2
    • addedInput schema / properties / options / properties / roughnessRange / minItems
      Added value: +2
    • removedInput schema / properties / options / properties / roughnessRange / prefixItems
      Removed value: -[
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  {
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  }
      -]
  3. Changed3 schema fields changed
    • addedInput schema / properties / options
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "alphaCutoff": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "alphaMode": {
      +      "enum": [
      +        "opaque",
      +        "mask",
      +        "blend"
      +      ],
      +      "type": "string"
      +    },
      +    "displacementMode": {
      +      "enum": [
      +        "none",
      +        "bump",
      +        "displacement"
      +      ],
      +      "type": "string"
      +    },
      +    "emissionStrength": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightMidlevel": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightScale": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "heightSource": {
      +      "enum": [
      +        "none",
      +        "luminance",
      +        "alpha"
      +      ],
      +      "type": "string"
      +    },
      +    "maxSize": {
      +      "maximum": 4096,
      +      "minimum": 8,
      +      "type": "integer"
      +    },
      +    "metallic": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "normalConvention": {
      +      "enum": [
      +        "opengl",
      +        "directx"
      +      ],
      +      "type": "string"
      +    },
      +    "normalStrength": {
      +      "maximum": 16,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "outputNormalConvention": {
      +      "enum": [
      +        "opengl",
      +        "directx"
      +      ],
      +      "type": "string"
      +    },
      +    "packing": {
      +      "enum": [
      +        "none",
      +        "orm"
      +      ],
      +      "type": "string"
      +    },
      +    "physicalCoverageMeters": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "height": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 100000,
      +          "type": "number"
      +        },
      +        "width": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 100000,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "width",
      +        "height"
      +      ],
      +      "type": "object"
      +    },
      +    "roughness": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "roughnessMode": {
      +      "enum": [
      +        "constant",
      +        "luminance",
      +        "inverted_luminance"
      +      ],
      +      "type": "string"
      +    },
      +    "roughnessRange": {
      +      "prefixItems": [
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      ],
      +      "type": "array"
      +    },
      +    "seamMode": {
      +      "enum": [
      +        "analyze",
      +        "blend"
      +      ],
      +      "type": "string"
      +    },
      +    "specular": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "tile": {
      +      "enum": [
      +        "none",
      +        "x",
      +        "y",
      +        "xy"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / profile
      Added value: +{
      +  "enum": [
      +    "surface",
      +    "decal",
      +    "supplied"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / roles
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "base_color",
      +      "normal",
      +      "height",
      +      "roughness",
      +      "metallic",
      +      "opacity",
      +      "emission",
      +      "ao",
      +      "specular",
      +      "specular_color",
      +      "gloss",
      +      "cavity",
      +      "diffuse"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 13,
      +  "minItems": 1,
      +  "type": "array"
      +}
  4. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic write/openWorld/idempotent profile; the description adds substantive behavior: deterministic (no AI), commits a new revision, applyToObjects assigns it, maps pack into the .blend, maps cap at 2048px, decals preserve transparency without implicit relief/metallic, and it returns a durable job handle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core behavior and the 2048px limitation before the pipeline and profile caveats. Dense but nearly every sentence carries operative information; the profile/legacy sentence is long and slightly clotted but earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter, nested-object mutation tool with an output schema, the description covers the important gaps: prerequisite chain, revision commit semantics, size ceiling, profile branching, and job-handle return. It leaves numeric fallback defaults to the schema, which is acceptable given they are documented there.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Raw schema description coverage is 19%, but the nested options object is actually well documented in-schema, so the real gap is the top-level params (emboss, baseRoughness, maskRoughness, baseColor, maskSource, applyToObjects). The description compensates by explaining how the mask drives derived roughness, how base color is composited, and the profile-vs-legacy argument split, though it does not define individual numeric fallbacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource+scope: 'Turn ONE uploaded image ... into a full PBR material — deterministic, no AI.' It also names the map outputs (roughness, normal, height, metallic, base color) and the 2048px cap, letting an agent distinguish it from material_from_maps and texture_maps_create without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite pipeline (upload_create → PUT → upload_complete → material_from_image) and routes full-resolution label/print work to asset_import with a stated reason. It also gives the when-to-use rule for profile vs the legacy mask/emboss arguments, which is exactly the kind of alternative-selection guidance the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources