Benchmark method · 2026-09-03
Image-to-PBR benchmark methodology
This page freezes the tester, machine, product versions, settings, test inputs, measurements, and interpretation limits for the 2026-09-03 edition.
Tester and environment
Tester: justhim. Windows 11 Home build 26200; AMD Ryzen 5 5600X; 31.9 GB RAM; NVIDIA GeForce RTX 5070; Node v24.13.1 for the PLAYTEX AI reference-core run. GenPBR ran in the Codex in-app Chromium browser.
Inputs
All three PNGs are fixed 512×512 crops from /public/images/image-to-texture/phone-wood-source.webp. Crop coordinates and hashes are in settings.json and sha256sums.txt.
- Neutral wood crop: left 60, top 260, width 512, height 512. Lower-glare section used as the baseline wood case.
- Glare hotspot crop: left 300, top 440, width 512, height 512. Tests whether photographed lighting is carried into derived maps.
- Dark edge and trim crop: left 568, top 300, width 512, height 512. Tests strong boundary contrast and repeat-edge behavior.
Product settings
PLAYTEX AI used checked-in defaults, the dielectric material class, wood preset, and seven requested channels at 512px. GenPBR 2.7 used Canvas CPU mode with normal 5.0, metallic 0.8, roughness 2.0, AO 2.0, radius 12, height contrast 1.00, brightness 0.00, and invert off.
Full settings JSON
{
"benchmark": {
"edition": "2026-09-03",
"tester": "justhim",
"testedAt": "2026-09-03T09:00:00-05:00",
"sourcePhoto": "/images/image-to-texture/phone-wood-source.webp",
"sourcePhotoSha256": "eb05ba5741f461bb23dd4d0306e42113cb2390cdcc935d03216db1d3d411326f",
"inputContract": "Three 512×512 PNG crops from one first-party phone photo; no retouching after crop.",
"machine": {
"operatingSystem": "Microsoft Windows 11 Home build 26200",
"cpu": "AMD Ryzen 5 5600X 6-Core Processor (12 logical processors)",
"memory": "31.9 GB",
"gpu": "NVIDIA GeForce RTX 5070",
"node": "v24.13.1"
}
},
"products": {
"playtex": {
"name": "PLAYTEX AI PBR Map Generator",
"version": "reference build 2ae3dbaf971b21895a84697b5775fa0509cfedf5",
"committedAt": "2026-09-03T04:57:47-05:00",
"implementationFiles": {
"src/constants/defaults.ts": "b53b66cbdfd47d922f17c7b796a151255b9926a88cb2cac79aafd069fd0bcee7",
"src/lib/imageProcessing.ts": "0871f380b6d76d92dc56990a2fb9612be872f58832076ac98854a5921a5e4a1f",
"src/lib/materialHeuristics.ts": "3b85034a18e1f04e4e65f8c48c6aa1092320ef82032e9ed11f77cb59d78547f1",
"src/lib/pbrCalibration.ts": "61b0b46705e6a1a68b3ddfb259df54eee02ea580ac43a0655cbfa5cfe262251a",
"src/lib/pbrGenerationCore.ts": "96aa5cfbeba5af7d22bc2e9d0432b5b717d350b6dcb6152a01f3957d178c9349",
"src/lib/processingSettings.ts": "5f3f6b6e7727abfc1fd0fcfc0f300479a956e528d4e9b3ed8176d74d26b93f6a"
},
"execution": "Direct synchronous reference-core call using the repository implementation.",
"inputResolution": "512×512",
"outputResolution": "512×512",
"materialClass": "dielectric",
"materialPreset": "wood",
"requestedMaps": [
"albedo",
"normal",
"metallic",
"emission",
"roughness",
"height",
"ao"
],
"settings": {
"albedo": {
"brightness": 0,
"contrast": 1,
"saturation": 1,
"hueShift": 0,
"gamma": 1
},
"normal": {
"strength": 5,
"blur": 0,
"detail": 1,
"invertX": false,
"invertY": false,
"format": "opengl",
"seamless": false,
"edgeEmphasis": 0.5,
"microDetailScale": 1,
"heightToNormalInfluence": 0.3
},
"metallic": {
"mode": "smart",
"threshold": 128,
"contrast": 1,
"clampMin": 0,
"clampMax": 255,
"sourceChannel": "luminance"
},
"emission": {
"threshold": 200,
"mode": "solid",
"color": "#ffffff",
"gradientColors": [
"#ff0000",
"#ffff00",
"#00ff00",
"#00ffff",
"#0000ff"
],
"gradientIntensities": [
1,
1,
1,
1,
1
],
"intensity": 1,
"glowRadius": 0,
"sourceMode": "luminance",
"softThreshold": 0.2,
"falloffCurve": "smooth",
"invertOutput": false,
"colorMatch": false
},
"roughness": {
"source": "luminance",
"blackPoint": 0,
"whitePoint": 255,
"contrast": 1,
"outputMode": "roughness",
"clampMin": 0,
"clampMax": 255,
"invertOutput": false,
"responseCurve": "linear"
},
"height": {
"strength": 1,
"blur": 0,
"midpointBias": 0,
"clampMin": 0,
"clampMax": 255,
"parallaxSafe": false
},
"ao": {
"radius": 2,
"intensity": 1,
"edgeOcclusionBoost": false,
"heightAwareAO": false
},
"global": {
"seamAwareProcessing": false,
"mapConsistencyLock": true,
"powerOfTwoLock": false
}
},
"repetitions": "One warm-up, then five measured generations per crop.",
"deterministicAcrossMeasuredRuns": {
"wood-neutral": true,
"glare-hotspot": true,
"dark-edge": true
},
"pricingAsOfTest": {
"free": {
"monthlyPriceUsd": 0,
"download": false,
"maxMapResolutionPx": 512,
"licenseScope": "noncommercial_public"
},
"mapper": {
"monthlyPriceUsd": 3,
"download": true,
"maxMapResolutionPx": 2048,
"licenseScope": "personal"
},
"starter": {
"monthlyPriceUsd": 9,
"download": true,
"maxMapResolutionPx": 2048,
"enginePackageExport": true,
"licenseScope": "standard_commercial"
}
},
"exportFormats": [
"PNG map files",
"ZIP material set",
"engine package on Starter+"
]
},
"genpbr": {
"name": "GenPBR",
"version": "2.7 (page header observed on test date)",
"url": "https://genpbr.com/generate",
"execution": "Public anonymous generator in the Codex in-app Chromium browser.",
"renderingMode": "Canvas CPU • Universal",
"inputResolution": "512×512",
"outputResolution": "512×512",
"maps": [
"normal",
"metallic",
"roughness",
"height",
"ao"
],
"settings": {
"normalStrength": 5,
"metallicIntensity": 0.8,
"roughnessIntensity": 2,
"aoIntensity": 2,
"aoRadius": 12,
"heightContrast": 1,
"heightBrightness": 0,
"invertHeight": false
},
"repetitions": "One captured generation per crop; glare and neutral normal maps were regenerated and SHA-256 matched the first capture.",
"observedAnonymousPriceUsd": 0,
"pricingAsOfTest": {
"freeAccount": "$0; non-commercial use only; attribution required.",
"starterMonthly": "$9.99/month; commercial rights listed."
},
"observedControls": [
"Download All",
"per-map download",
"Regen"
],
"documentedFormats": [
"PNG",
"ZIP archive",
"MaterialX"
],
"requiredFreeOutputAttribution": "Textures generated with GenPBR — genpbr.com",
"pricingSource": "https://genpbr.com/pricing",
"licensingSource": "https://genpbr.com/licensing"
}
}
}Measurement definitions
- Opposing-edge delta
- For every row, compare left and right RGB edge pixels; for every column, compare top and bottom. Average the absolute channel differences and divide by 255. Lower means the boundary values are closer. It does not prove the texture is seamless or correct.
- Metallic output on wood
- Mean encoded metallic luminance plus the percentage of pixels above 0.10. Wood is a dielectric, so a mean near zero is expected; the threshold share is reported as a second view and is not used alone.
- Normal length error
- Decode RGB from [0,255] to [-1,1], calculate vector length, and average |length−1|.
- Source-height correlation
- Pearson correlation between source luminance and height-map luminance. It is descriptive, not a quality score.