fal-ai/patina

PATINA creates seamless high-resolution normal, roughness, basecolor (albedo), height (displacement) and metalness maps from images
Inference
Commercial use

Input

Additional Settings

Customize your input with more control.

Result

Idle

What would you like to do next?

Your request will cost $0.01 plus $0.01 per megapixel, per output map. For example, a 1024x1024 input image generating all 5 map types will cost $0.06

Logs

PATINA - Image to PBR Maps

Endpoint: fal-ai/patina

Category: Image-to-image

Pricing: $0.01 base + $0.01 per megapixel per output map

Give PATINA an image that already looks the way you want, and it will predict a full set of PBR material maps from it. The image itself is not modified - it is analyzed to extract physically-based material properties.


When to use this

Use this endpoint when you already have a texture or photo and just need PBR maps generated from it. No changes are made to the original image.

Good for:

  • A photo of a real surface (brick, wood, metal) that you want to use as a 3D material
  • A texture from another tool that needs PBR data added
  • Any flat image you want to turn into a full PBR material

Use a different endpoint if:

  • You want to generate a new texture from a text description - use /patina/material
  • You want to create variations of an existing texture - use /patina/material with image_url
  • You have a photo of a scene and want to extract a specific material from it - use /patina/material/extract

Quick start

javascript
import { fal } from "@fal-ai/client";

const result = await fal.subscribe("fal-ai/patina", {
  input: {
    image_url: "https://example.com/my-texture.jpg"
  }
});

// result.data.images - array of PBR maps, each with a map_type

Input

ParameterTypeRequiredDefaultDescription
image_urlstringYes-URL of the input image (photo or render)
mapsstring[]NoAll fiveWhich PBR maps to generate: basecolor, normal, roughness, metalness, height
seedintegerNoRandomSeed for reproducible denoising
output_formatstringNo"png"Output format: jpeg, png, or webp
enable_safety_checkerbooleanNotrueEnable safety filtering on outputs
sync_modebooleanNofalseIf true, return images as data URIs instead of CDN URLs
Example request
json
{
  "image_url": "https://example.com/brick-wall.jpg",
  "maps": ["basecolor", "normal", "roughness", "metalness", "height"],
  "output_format": "png"
}

Output

FieldTypeDescription
imagesMapImageFile[]Array of predicted PBR maps. Each entry includes url, content_type, file_name, file_size, and map_type
seedintegerThe seed used for denoising
timingsobjectTiming breakdown in seconds
Example response
json
{
  "images": [
    { "url": "https://fal.media/files/...", "map_type": "basecolor" },
    { "url": "https://fal.media/files/...", "map_type": "normal" },
    { "url": "https://fal.media/files/...", "map_type": "roughness" },
    { "url": "https://fal.media/files/...", "map_type": "metalness" },
    { "url": "https://fal.media/files/...", "map_type": "height" }
  ],
  "seed": 42
}

Output maps explained

MapWhat it represents
Base ColorThe surface color (albedo). What the material looks like without lighting effects.
NormalPer-pixel surface orientation. Adds fine detail and bumps without changing geometry.
RoughnessHow rough or smooth each point is. Controls reflection sharpness.
MetalnessWhether each point is metallic or dielectric. Affects how light reflects and refracts.
HeightElevation data. Can be used for parallax mapping or actual mesh displacement.

Code examples

JavaScript
javascript
import { fal } from "@fal-ai/client";

const result = await fal.subscribe("fal-ai/patina", {
  input: {
    image_url: "https://example.com/my-texture.jpg"
  },
  logs: true,
  onQueueUpdate: (update) => {
    if (update.status === "IN_PROGRESS") {
      update.logs.map((log) => log.message).forEach(console.log);
    }
  },
});
console.log(result.data);
Python
python
import fal_client

result = fal_client.subscribe(
    "fal-ai/patina",
    arguments={
        "image_url": "https://example.com/my-texture.jpg"
    },
    with_logs=True,
)
print(result)
cURL
bash
curl -X POST https://fal.run/fal-ai/patina \
  -H "Authorization: Key $FAL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"image_url": "https://example.com/my-texture.jpg"}'