feat(web): finish RE 5000PBR lesson video and fix non-ASCII GLB import
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

- Add 11:07 Chinese-narrated lesson video, VTT, poster and 13 chapter screenshots.
- Regenerate 20-render WebGL2 matrix and 15 operation captures on RTX 4060.
- Fix WASM staging for non-ASCII import filenames (猴头.glb); rebuild web_engine.
- Harden lesson video recording pipeline; fix stale lesson-link E2E selector.
- Add RE PBR derived libraries, lesson page, evidence and status report.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-12 21:49:24 +08:00
parent a078648297
commit d5dd647881
276 changed files with 9632 additions and 314 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View File

@@ -0,0 +1,52 @@
{
"schemaVersion": 1,
"task": "RE-PBR-LIMITS-001",
"batch": "D-diagnostics",
"status": "PASS",
"generatedAt": "2026-11-12T02:45:33.522245+00:00",
"material": "black_worn_wall_brick",
"resolution": 512,
"camera": "SCENE",
"views": [
{
"mode": "BASE_COLOR",
"path": "tests/golden/RE-PBR-LIMITS-001/diagnostics/diagnostic-base-color-512.png",
"sha256": "ecb7eb53cc87bd921d3b80a98fe4d9b364fe73f1e75b384edaf02f6b4778c773",
"bytes": 140435,
"resolution": 512,
"mean": 93.8943,
"std": 44.8765
},
{
"mode": "NORMAL",
"path": "tests/golden/RE-PBR-LIMITS-001/diagnostics/diagnostic-normal-512.png",
"sha256": "986d33b201f3d53754ba0001d4c5e7890297d96e8c834c4365f89047f31e0dfa",
"bytes": 149281,
"resolution": 512,
"mean": 97.0305,
"std": 46.0513
},
{
"mode": "ROUGHNESS",
"path": "tests/golden/RE-PBR-LIMITS-001/diagnostics/diagnostic-roughness-512.png",
"sha256": "c4e3989db1863209800c46b69e5c8184b5bc38f1941d550b18b793adf20ea97f",
"bytes": 115922,
"resolution": 512,
"mean": 99.7463,
"std": 48.5612
}
],
"exposure": {
"values": [
0,
2
],
"meanDeltaGreaterThan": 1,
"result": "PASS"
},
"notes": [
"Diagnostic views replace only the active object material for the still; the ground stays final.",
"Base Color = MeshBasicMaterial(map); Normal = MeshNormalMaterial(normalMap); Roughness = MeshBasicMaterial(roughnessMap).",
"Teaching exposure is a renderer toneMappingExposure multiplier and does not change material data."
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

View File

@@ -0,0 +1,42 @@
{
"schemaVersion": 1,
"task": "RE-PBR-LIMITS-001",
"batch": "A-displacement",
"status": "PASS",
"generatedAt": "2026-11-12T02:13:19.742774+00:00",
"nativeBinding": {
"usage": "HEIGHT",
"imageId": "image:black_worn_wall_brick_Height.jpg",
"scale": 0.001,
"midlevel": 0.5,
"bias": -0.0005
},
"subdivision": {
"level": 3,
"sourceTriangles": 968,
"renderTriangles": 61952,
"maxTriangles": 100000
},
"renders": {
"1x": {
"path": "tests/golden/RE-PBR-LIMITS-001/displacement/displacement-1x-1024.png",
"sha256": "95105d1e3d3844c815e39a9a41f41761cc798a5cc7f1756f9fd5521f545470ea",
"bytes": 395215,
"mean": 93.9552,
"std": 44.7742
},
"100x": {
"path": "tests/golden/RE-PBR-LIMITS-001/displacement/displacement-100x-1024.png",
"sha256": "f5b5e0872de3ad9cb34479a867c892bcd2e69c8a06eab57bd1fdf8dd69f905d5",
"bytes": 395465,
"mean": 93.8682,
"std": 44.8044
}
},
"meanDelta": 0.087,
"notes": [
"HEIGHT binding comes from the native reader of the real RE library blend.",
"renderStill subdivides the 968-triangle monkey to 61,952 triangles at level 3 and applies MeshPhysicalMaterial.displacementMap.",
"1x preserves the source Scale=0.001; 100x is a renderer-only teaching multiplier and does not write the material."
]
}

View File

@@ -0,0 +1,84 @@
{
"schemaVersion": 1,
"task": "RE-PBR-LIMITS-001",
"batch": "0-gpu-enable",
"status": "PASS",
"generatedAt": "2026-11-12T00:58:45.890906+00:00",
"browser": {
"executable": "/usr/bin/google-chrome",
"headed": true,
"display": ":1"
},
"launch": {
"gpuMode": "hardware",
"args": [
"--no-sandbox",
"--use-gl=angle",
"--use-angle=gl",
"--ignore-gpu-blocklist",
"--enable-gpu-rasterization",
"--enable-zero-copy",
"--enable-unsafe-webgpu"
]
},
"webgl": {
"vendor": "Google Inc. (NVIDIA Corporation)",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"webgpu": {
"adapter": "present",
"info": {}
},
"e2e": {
"spec": "web/tests/e2e/re-pbr-render-workflow.spec.ts",
"grep": "assign six materials",
"result": "1 passed",
"durationSeconds": 27.0,
"swiftshaderReferenceDurationSeconds": 35.8
},
"render": {
"material": "black_worn_wall_brick",
"resolution": 1024,
"camera": "SCENE",
"hardware": {
"path": "tests/golden/RE-PBR-LIMITS-001/gpu/hardware-black_worn_wall_brick-1024.png",
"sha256": "62d9aaf2b598f7622029a66c483cdcd6388bb47e4d2b4bb43476739742a1ce67",
"bytes": 412605
},
"swiftshader": {
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_worn_wall_brick-1024-scene.png",
"sha256": "16f7d4ef3ae678c7d787c1da470d0bc7363e0ed160b7f7e42d4b3a21361ce0b5",
"bytes": 399540
},
"meanStd": {
"hardware": {
"mean": 95.277,
"std": 44.758
},
"swiftshader": {
"mean": 95.332,
"std": 44.724
}
},
"note": "Renderer confirms NVIDIA RTX 4060 via ANGLE; SHA differs only by raster timing, mean/std within 0.06."
},
"notes": [
"Playwright config now selects hardware when GPU_MODE=hardware or DISPLAY is present; SwiftShader is explicit fallback.",
"Capture scripts accept --gpu hardware|swiftshader and probe WEBGL_debug_renderer_info before capture; hardware lane fails closed on SwiftShader/llvmpipe."
],
"hardwareCapture": {
"status": "PASS",
"renders": 20,
"steps": 15,
"uniqueSha": 20,
"report": "tests/golden/RE-PBR-RENDER-001/report.json",
"reportSha256": "40c5a758df05c566d24c9973862c6bb6fa01e74dc6bbc772f4fe5a9623be4481",
"webgl": {
"vendor": "Google Inc. (NVIDIA Corporation)",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"note": "20/20 unique; SCENE vs VIEWPORT now differ because the capture waits for the new result src / idle button. ready:0:0 on reopen remains for Phase C."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

View File

@@ -0,0 +1,38 @@
{
"schemaVersion": 1,
"task": "RE-PBR-LIMITS-001",
"batch": "E-hq-2048",
"status": "PASS",
"generatedAt": "2026-11-12T02:56:52.562806+00:00",
"library": {
"id": "library:re-pbr-hq-v1",
"path": "web/app/public/assets/re-pbr-hq/re-pbr-library.blend",
"sha256": "2875cf7b3715fb0658582e2c6219300b72681e477079506e1b41a8551cd62efe",
"bytes": 10846909,
"textures": "original 2048 packed JPEG"
},
"material": "black_worn_wall_brick_HQ",
"resolution": 1024,
"camera": "SCENE",
"render": {
"path": "tests/golden/RE-PBR-LIMITS-001/hq/hq-2048-1024.png",
"sha256": "6ed6a69b7eb5a130037da32303b4f3d6a64bb940953934d3640070d548afca06",
"bytes": 396748,
"mean": 93.9619,
"std": 44.7738
},
"budget": {
"gpuDecodedBytes": 67633152,
"payloadBytes": 2625921,
"loaded": 5,
"rejected": 0,
"underWebGL2Limit": true,
"webgl2DecodedLimitBytes": 536870912
},
"mode": "lazy on-demand via PbrLessonPanel; standard library remains default",
"notes": [
"HQ material names use _HQ suffix to avoid conflict with standard library.",
"Native reader now reads packed JPEG dimensions; Height images verified 2048x2048.",
"Budget is base-level decoded; mipmaps can add ~1/3."
]
}

View File

@@ -0,0 +1,102 @@
{
"schemaVersion": 1,
"task": "RE-PBR-LIMITS-001",
"status": "IMPLEMENTED_NOT_USER_ACCEPTED",
"generatedAt": "2026-11-12T03:10:25.986813+00:00",
"gpu": {
"mode": "hardware",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)"
},
"evidence": {
"displacement": {
"path": "tests/golden/RE-PBR-LIMITS-001/displacement/report.json",
"sha256": "7cb8f1c699f869e197aa8995a71dd2c002388080aa33aaecc3eb467027f43073",
"bytes": 1361
},
"diagnostics": {
"path": "tests/golden/RE-PBR-LIMITS-001/diagnostics/report.json",
"sha256": "0931566cf9c2b0575659f6aba0a22f27216d43e2edc14e67536eff7a5689ee8c",
"bytes": 1633
},
"hq": {
"path": "tests/golden/RE-PBR-LIMITS-001/hq/report.json",
"sha256": "034188535227a629e9da69b700edd287f102629c058041ce6de159194c7c6154",
"bytes": 1252
},
"gpuEnable": {
"path": "tests/golden/RE-PBR-LIMITS-001/gpu/batch0-gpu-enable.json",
"sha256": "f74d4da0e4858cff4fe1f5602face87e313f8b00dcde90fa5e4ba03969cbe5a9",
"bytes": 2839
},
"renders": {
"path": "tests/golden/RE-PBR-RENDER-001/report.json",
"sha256": "1478eae327295857a12d757e3d5f5f06c2d6f0f9adb89c411a4c752d10cc62c4",
"bytes": 17168
},
"lesson": {
"path": "web/app/public/tutorial/pbr/render-lesson.html",
"sha256": "fb2aaf90c7e08c30273cf2ddee6535b75ccf628beb9ba07c2c85251dd893473d",
"bytes": 27485
},
"hqLibrary": {
"path": "web/app/public/assets/re-pbr-hq/re-pbr-library.blend",
"sha256": "2875cf7b3715fb0658582e2c6219300b72681e477079506e1b41a8551cd62efe",
"bytes": 10846909
}
},
"summary": {
"displacement": {
"nativeUsage": "HEIGHT",
"scale": 0.001,
"midlevel": 0.5,
"sourceTriangles": 968,
"renderTriangles": 61952,
"meanDelta": 0.087
},
"diagnostics": {
"views": [
"BASE_COLOR",
"NORMAL",
"ROUGHNESS"
],
"exposureEv": [
0,
2
]
},
"hq": {
"libraryBytes": 10846909,
"gpuDecodedBytes": 67633152,
"payloadBytes": 2625921,
"loaded": 5,
"rejected": 0
},
"camera": {
"presets": [
"SCENE_CAMERA",
"COMPARISON"
],
"uniqueRenders": 20
},
"reopen": {
"textureStatus": "ready:5:0:",
"loaded": 5
},
"crossBrowser": "policy-excluded: Chromium-only"
},
"checks": {
"typecheck": "PASS",
"unitShaderCompiler": "13/13",
"mainE2E": "PASS 3.6m",
"fastE2E": "5/5",
"pbrRegressions": "3/3",
"checkRePbrLesson": "PASS",
"checkRePbrLibraryHQ": "PASS",
"checkRePbrLimits": "PASS"
},
"notes": [
"Desktop EEVEE reference not run; displacement proof is Web 100x.",
"HQ mipmaps can add ~1/3 over base-level budget.",
"User acceptance pending."
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

View File

@@ -0,0 +1,79 @@
{
"schemaVersion": 1,
"task": "RE-PBR-RENDER-001",
"status": "IMPLEMENTED_NOT_USER_ACCEPTED",
"renderer": "WEB_WEBGL2",
"headed": true,
"browser": "151.0.7922.137",
"display": ":1",
"generatedAt": "2026-11-11T14:46:37.441Z",
"source": {
"catalog": {
"path": "re/5000PBR\u7cbe\u7b80\u7248/5000+ PBR catalog.blend",
"sha256": "54942f057f913c9923752ba0d4ddcfa6d1f77e98c5e812b83409fb128968c125"
},
"glb": {
"path": "tests/files/web/pbr-render-lesson/monkey-head.glb",
"sha256": "60267d607b63ceb5bfc972342a9ff17310d6978ff632f240ecb963c4d5a7e003"
},
"studio": {
"path": "web/app/public/tutorial/pbr/studio.blend",
"sha256": "621ffacc0eaea9f9efd087849de048804dd45cd13f94494b1f1a91328143feed"
}
},
"derived": {
"library": {
"path": "web/app/public/assets/re-pbr/re-pbr-library.blend",
"sha256": "d67f5a058c154626dfc7171c5bc7fc254b8ee183fea8740261b9711b3309d782",
"libraryId": "library:re-pbr-v1"
},
"manifest": {
"path": "web/app/public/assets/re-pbr/manifest.json",
"sha256": "2c68527e7ecfa5107aff2161a642c49135ec212e78532cf49682563ac0f3fdd0"
},
"materials": 6,
"previews": 6
},
"rendererArtifact": {
"web_engine.wasm": "909290259e2911af49f1d6f308e1e05e01f62aa1841847b878bcd3191b98c24c"
},
"lesson": {
"html": {
"path": "web/app/public/tutorial/pbr/render-lesson.html",
"sha256": "d7a1545c225c60f30a7ecb190bcbf3cf89b7e2fdaaaae65dde58db67e476490f"
},
"css": {
"path": "web/app/public/tutorial/pbr/render-lesson.css",
"sha256": "72118b8b041fb457c7f8cdc26c5d1eb3be3493a3fed46a62d893a26b9394ee76"
},
"renders": 20,
"steps": 15
},
"checks": {
"re-pbr-library": "PASS",
"shader-compiler-unit": "13/13",
"typecheck": "PASS",
"build": "PASS",
"re-pbr-render-workflow-e2e-headed": "2/2",
"pbr-regressions-headed": "3/3",
"re-pbr-lesson-check": "PASS",
"lesson-page-headed": "35 images decoded; no HTTP failures"
},
"report": {
"path": "tests/golden/RE-PBR-RENDER-001/report.json",
"sha256": "cf9ad91274e0709e767220300754e1a4e3bb2a1cf82c39c86fe3bb8c81073aee"
},
"notes": [
"Six RE materials include the formerly unmarked Black_Anti_Slip_grip; source .blend untouched.",
"Displacement is ignored by the Web renderer; Base Color/Normal/Roughness are rendered.",
"Viewport and scene camera images can be identical because the default viewport is aligned to the studio camera."
],
"savedProject": {
"path": "tests/golden/RE-PBR-RENDER-001/re-pbr-lesson-saved.blend",
"sha256": "8d41376ae030e1d2aad43a27dd511e446d141fc8122347af3d5cac422ede3ebb"
},
"lessonPageScreenshot": {
"path": "tests/golden/RE-PBR-RENDER-001/lesson-page.png",
"sha256": "e5d0359028241d873b50f66e61d5a98fc1e17e75e4fb81d8854bd17d762dbf38"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

View File

@@ -0,0 +1,411 @@
{
"schemaVersion": 1,
"task": "RE-PBR-RENDER-001",
"renderer": "WEB_WEBGL2",
"headed": true,
"gpuMode": "hardware",
"browser": "151.0.7922.137",
"chromePath": "/usr/bin/google-chrome",
"display": ":1",
"generatedAt": "2026-11-12T13:24:47.364Z",
"studioSha256": "621ffacc0eaea9f9efd087849de048804dd45cd13f94494b1f1a91328143feed",
"glbSha256": "60267d607b63ceb5bfc972342a9ff17310d6978ff632f240ecb963c4d5a7e003",
"materials": [
"Black_Anti_Slip_grip",
"Blackish_Brick_Wall_016",
"black_randome_tile",
"black_shinning_tile",
"black_tiles_wall",
"black_worn_wall_brick"
],
"renders": [
{
"name": "baseline-unassigned-1024-scene",
"material": null,
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/baseline-unassigned-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/baseline-unassigned-1024-scene.jpg",
"sha256": "4084f64fcd9cb981e241ddc120c5a0f6e256d1c7896d525579a6e3be60ffc265",
"byteLength": 333634,
"mean": 94.5402,
"std": 45.4315,
"textureStatus": "ready:1:0:",
"textureAssets": 1,
"compileStatus": "BASELINE"
},
{
"name": "material-Black_Anti_Slip_grip-1024-scene",
"material": "Black_Anti_Slip_grip-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Black_Anti_Slip_grip-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Black_Anti_Slip_grip-1024-scene.jpg",
"sha256": "dcc7194607f100bea6f8c7ae376cda991e208e0341e51f8f42edb8ea79026eeb",
"byteLength": 406827,
"mean": 94.6004,
"std": 45.5247,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-Black_Anti_Slip_grip-1024-viewport",
"material": "Black_Anti_Slip_grip-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Black_Anti_Slip_grip-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Black_Anti_Slip_grip-1024-viewport.jpg",
"sha256": "a2906859a592b3fe550db7cac69f6d968f8cccb92569dda2edcc50ff7670d760",
"byteLength": 552825,
"mean": 68.1723,
"std": 19.4146,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-Black_Anti_Slip_grip-512-scene",
"material": "Black_Anti_Slip_grip-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Black_Anti_Slip_grip-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Black_Anti_Slip_grip-512-scene.jpg",
"sha256": "d97dbd711526016c8f7e4abc6ea565ae1243a8f982bfce9eac6c3cfd4b256273",
"byteLength": 138648,
"mean": 94.5944,
"std": 45.4802,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-Blackish_Brick_Wall_016-1024-scene",
"material": "Blackish_Brick_Wall_016-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Blackish_Brick_Wall_016-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Blackish_Brick_Wall_016-1024-scene.jpg",
"sha256": "3f57bbdf0db50a9ef31e730e6e868e138917143fbb5f08c2d78fc10fd2d89d57",
"byteLength": 347506,
"mean": 93.4853,
"std": 45.7205,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-Blackish_Brick_Wall_016-1024-viewport",
"material": "Blackish_Brick_Wall_016-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Blackish_Brick_Wall_016-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Blackish_Brick_Wall_016-1024-viewport.jpg",
"sha256": "dc590cdd28d7a04f773a03fa8f5977adc22fd4db96df4b23196356380f322bd0",
"byteLength": 436440,
"mean": 66.7569,
"std": 17.6259,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-Blackish_Brick_Wall_016-512-scene",
"material": "Blackish_Brick_Wall_016-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-Blackish_Brick_Wall_016-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-Blackish_Brick_Wall_016-512-scene.jpg",
"sha256": "8b6a49a0c3141c9ac1c904792f47f8b4492348992db481550f2067c6c8a128c9",
"byteLength": 125970,
"mean": 93.4702,
"std": 45.7063,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_randome_tile-1024-scene",
"material": "black_randome_tile-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_randome_tile-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_randome_tile-1024-scene.jpg",
"sha256": "a54f9caf195b9726e6792dc3fa7e92d59c9dc485f3c3bc7e65d94cc62a900253",
"byteLength": 377709,
"mean": 93.6921,
"std": 45.541,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_randome_tile-1024-viewport",
"material": "black_randome_tile-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_randome_tile-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_randome_tile-1024-viewport.jpg",
"sha256": "697e37d18a2b7575b1b2a05a0b931c17565ac48c3869358dac1c509a21491457",
"byteLength": 469187,
"mean": 67.1074,
"std": 17.5655,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_randome_tile-512-scene",
"material": "black_randome_tile-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_randome_tile-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_randome_tile-512-scene.jpg",
"sha256": "ee40d1e815c7d60d8f96c5a0c3edeefdb3245a25c76c35ec7193e0d6bcc182e4",
"byteLength": 134145,
"mean": 93.6227,
"std": 45.5507,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_shinning_tile-1024-scene",
"material": "black_shinning_tile-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_shinning_tile-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_shinning_tile-1024-scene.jpg",
"sha256": "4252afbc06e936d552c40bd20c1de4fbf74902df5521e574b3e49f3633af045d",
"byteLength": 407550,
"mean": 94.6918,
"std": 45.7203,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_shinning_tile-1024-viewport",
"material": "black_shinning_tile-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_shinning_tile-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_shinning_tile-1024-viewport.jpg",
"sha256": "3996b7d704dceaa4215a0126db4ee6387ef00c48b67932e86c75983e22dd5c07",
"byteLength": 533567,
"mean": 68.3535,
"std": 20.5096,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_shinning_tile-512-scene",
"material": "black_shinning_tile-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_shinning_tile-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_shinning_tile-512-scene.jpg",
"sha256": "2a4bd3aa9aa24998d7d236b1450a95fc93ccaae8d34bc0ee2fe64620d8bf4c79",
"byteLength": 142153,
"mean": 94.6237,
"std": 45.5561,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_tiles_wall-1024-scene",
"material": "black_tiles_wall-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_tiles_wall-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_tiles_wall-1024-scene.jpg",
"sha256": "b2e037c2151bd53eab519f59495590c09588c0b89573b39c7b802435f91c5171",
"byteLength": 372178,
"mean": 94.207,
"std": 45.2282,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_tiles_wall-1024-viewport",
"material": "black_tiles_wall-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_tiles_wall-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_tiles_wall-1024-viewport.jpg",
"sha256": "0b1f61d4c9db1cb8b142af3b7bfa0bbca75884aba3f4130dec0e2e22269d3440",
"byteLength": 479935,
"mean": 68.0221,
"std": 17.3012,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_tiles_wall-512-scene",
"material": "black_tiles_wall-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_tiles_wall-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_tiles_wall-512-scene.jpg",
"sha256": "7bff874cb5992052880cbb947394d026589600fa59cc9b0405458edd605cfd9d",
"byteLength": 131660,
"mean": 94.1789,
"std": 45.2036,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_worn_wall_brick-1024-scene",
"material": "black_worn_wall_brick-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_worn_wall_brick-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_worn_wall_brick-1024-scene.jpg",
"sha256": "95105d1e3d3844c815e39a9a41f41761cc798a5cc7f1756f9fd5521f545470ea",
"byteLength": 395215,
"mean": 94.3206,
"std": 45.1801,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_worn_wall_brick-1024-viewport",
"material": "black_worn_wall_brick-1024-viewport",
"resolution": 1024,
"camera": "VIEWPORT",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_worn_wall_brick-1024-viewport.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_worn_wall_brick-1024-viewport.jpg",
"sha256": "1ac2d53d563f77a81e02d81c897bd1866a948e5451f9a89070d6ebbd00014461",
"byteLength": 530442,
"mean": 68.5761,
"std": 17.6293,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_worn_wall_brick-512-scene",
"material": "black_worn_wall_brick-512-scene",
"resolution": 512,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_worn_wall_brick-512-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_worn_wall_brick-512-scene.jpg",
"sha256": "0e175dc7ee9432e08496ad2ff57e96457646e08344039f7d6ee113c5f4b5376f",
"byteLength": 138231,
"mean": 94.2668,
"std": 45.1655,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "COMPILED"
},
{
"name": "material-black_worn_wall_brick-reopen-1024-scene",
"material": "black_worn_wall_brick-reopen-1024-scene",
"resolution": 1024,
"camera": "SCENE",
"path": "tests/golden/RE-PBR-RENDER-001/renders/material-black_worn_wall_brick-reopen-1024-scene.png",
"jpg": "web/app/public/tutorial/pbr/lesson/renders/material-black_worn_wall_brick-reopen-1024-scene.jpg",
"sha256": "d2c9f5eb4d3e93c24c7dd3d0d7e2c8e7eacee99698fca1d996ecacbdbbff147e",
"byteLength": 395066,
"mean": 94.3106,
"std": 45.1856,
"textureStatus": "ready:5:0:",
"textureAssets": 5,
"compileStatus": "REOPENED"
}
],
"steps": [
{
"name": "01-open-studio",
"path": "web/app/public/tutorial/pbr/lesson/steps/01-open-studio.jpg",
"sha256": "cbedb2be5fd6a9defebdddc23a2bbeb8410ea848416b9f677617e8c7b16af58d"
},
{
"name": "02-import-glb",
"path": "web/app/public/tutorial/pbr/lesson/steps/02-import-glb.jpg",
"sha256": "3a060c51daa6a61a98e07a80e8455373f8b7bebbfaccb7660215c47a41f173a2"
},
{
"name": "03-asset-library-Black_Anti_Slip_grip",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-Black_Anti_Slip_grip.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-Black_Anti_Slip_grip",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-Black_Anti_Slip_grip.jpg",
"sha256": "5c3501511c0aae269d40ac96f5f3375668c7e8304cbabfb7d757cd64ccd62faa"
},
{
"name": "03-asset-library-Blackish_Brick_Wall_016",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-Blackish_Brick_Wall_016.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-Blackish_Brick_Wall_016",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-Blackish_Brick_Wall_016.jpg",
"sha256": "fbd8a368e86bb19cce387312a23eeb5c503abc221475cda4e6feb2597a76d8d0"
},
{
"name": "03-asset-library-black_randome_tile",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-black_randome_tile.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-black_randome_tile",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-black_randome_tile.jpg",
"sha256": "9087fb6b6af7ac3e6291174a6df245c9ea49abf049444d0152e1396d4ad775ba"
},
{
"name": "03-asset-library-black_shinning_tile",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-black_shinning_tile.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-black_shinning_tile",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-black_shinning_tile.jpg",
"sha256": "cf3fbdaa66fd612f8d26faa6015f1abc208a64d06bdedd77bea9e4ca1d23b383"
},
{
"name": "03-asset-library-black_tiles_wall",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-black_tiles_wall.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-black_tiles_wall",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-black_tiles_wall.jpg",
"sha256": "9ee41dd525128d31ed46664d9edfcf3de150db65c47522002cd307605af7681e"
},
{
"name": "03-asset-library-black_worn_wall_brick",
"path": "web/app/public/tutorial/pbr/lesson/steps/03-asset-library-black_worn_wall_brick.jpg",
"sha256": "afdca32dc63617c82ca199c1fdcab51998dc17618d2098ab0f1bd412eb005eef"
},
{
"name": "04-assign-black_worn_wall_brick",
"path": "web/app/public/tutorial/pbr/lesson/steps/04-assign-black_worn_wall_brick.jpg",
"sha256": "847032ffa0bbed0836478b0468504b0c48709159240351c4e21bffef9198e86f"
},
{
"name": "05-reopen",
"path": "web/app/public/tutorial/pbr/lesson/steps/05-reopen.jpg",
"sha256": "f09769ce96480560b499ad616ab868f3a8ddeb97a4f7998bb9f80c451da6b4e7"
}
],
"errors": [],
"webgl": {
"vendor": "Google Inc. (NVIDIA Corporation)",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"webgpu": {
"info": {}
},
"status": "PASS",
"consoleErrors": []
}

View File

@@ -0,0 +1,109 @@
{
"voice": "zh-CN-XiaoxiaoNeural",
"chapters": [
{
"id": "intro",
"title": "开场:会得到什么",
"narration": "这一课我们从灰色猴头开始。你会打开摄影棚,导入只有一个猴头网格的 GLB 文件,从 RE 五零零零 PBR 资产库分配六种材质,最后在浏览器里用显卡渲染、下载 PNG、保存工程并重新打开。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/intro.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/intro.wav",
"durationMs": 19608
},
{
"id": "open-studio",
"title": "载入摄影棚",
"narration": "先打开 Web Blender 的 Rendering 工作区。在 PBR 渲染练习面板里点击载入练习摄影棚。这个场景已经准备好相机、三点面光、太阳光、世界环境和地面。等待状态栏显示 Engine SceneIR,并且对象数是六。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/open-studio.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/open-studio.wav",
"durationMs": 19992
},
{
"id": "import-glb",
"title": "导入猴头 GLB",
"narration": "接下来点击导入猴头 GLB,选择课程目录里的 monkey head 点 GLB。导入会追加到当前场景,不会替换摄影棚。看到对象数从六变成七,活动对象是 Suzanne 就对了。此时猴头没有材质,所以是灰色的,这是正常的基线。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/import-glb.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/import-glb.wav",
"durationMs": 21216
},
{
"id": "asset-library",
"title": "认识 Shading 与 RE 资产库",
"narration": "切换到 Shading 工作区。左下角是 PBR 资产库,现在有二十个资产。用资产来源下拉框选择 RE 五零零零 PBR,只留下六张材质卡片。单击卡片只会选中,双击才会把材质分配出去。缩略图加载完成后就可以继续。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/asset-library.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/asset-library.wav",
"durationMs": 22176
},
{
"id": "assign-materials",
"title": "分配六种材质",
"narration": "回到 Rendering 工作区。在 PBR 渲染练习面板下方,新加了 RE 五零零零 PBR 材质选择器,它显示完整材质名和缩略图,不受左侧窄栏影响。依次双击六种材质:防滑颗粒、砖墙、随机瓷砖、光亮瓷砖、规则砖墙和做旧砖墙。每次等待材质槽更新,并确认材质球显示 COMPILED。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/assign-materials.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/assign-materials.wav",
"durationMs": 28608
},
{
"id": "render-settings",
"title": "设置渲染",
"narration": "现在设置渲染。分辨率选一零二四,相机选场景相机,视图保持最终材质,教学曝光保持零,位移强度保持一倍,视角预设选场景相机对齐。这样得到的就是固定摄影棚下的标准成片。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/render-settings.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/render-settings.wav",
"durationMs": 18648
},
{
"id": "render-download",
"title": "渲染与下载 PNG",
"narration": "点击渲染 PBR。面板会先等待纹理和环境贴图就绪,然后输出一张一零二四乘一零二四的 WebGL2 成片。结果出现后,点击下载 PNG,浏览器会保存 pbr 一零二四点 PNG。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/render-download.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/render-download.wav",
"durationMs": 18312
},
{
"id": "save-reopen",
"title": "保存与重开",
"narration": "点击顶部的保存项目,下载点 blend 工程。然后再次导入刚才保存的工程;如果询问是否保存当前修改,选择不保存并继续。重新打开后对象数仍是七,材质槽仍然保留做旧砖墙,再渲染一次确认贴图没有丢失。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/save-reopen.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/save-reopen.wav",
"durationMs": 20568
},
{
"id": "diagnostics",
"title": "诊断视图与教学曝光",
"narration": "深色材质只看整体亮度容易误判。把视图切到 Base Color,可以看到基础色贴图;切到 Normal,可以看到法线和砖缝;切到 Roughness,可以看到粗糙度。教学曝光可以加一档或两档 EV,只改变渲染曝光,不改变材质本身。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/diagnostics.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/diagnostics.wav",
"durationMs": 20880
},
{
"id": "displacement",
"title": "位移与细分",
"narration": "Height 贴图现在会真正参与几何位移。位移强度一倍保留源材质零点零零一的 Scale,画面变化很细;切到一百倍只是渲染时的教学放大,不写回材质。静帧会把九百六十八个三角形细分到六万一千九百五十二个,再执行位移。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/displacement.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/displacement.wav",
"durationMs": 21048
},
{
"id": "camera",
"title": "对比视角",
"narration": "视角预设默认与场景相机精确对齐,所以场景和视口可能看起来一样。选择对比四十五度后,当前视口会以主体为中心偏转三十度,得到明显不同的构图;主视口导航不受影响。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/camera.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/camera.wav",
"durationMs": 17520
},
{
"id": "hq-2048",
"title": "高清 2048 贴图",
"narration": "如果需要原始分辨率,点击加载高清贴图二零四八。素材会按需合并,材质名带 HQ 后缀。切换到高清来源,双击分配做旧砖墙 HQ,再渲染一次。五个纹理全部加载,显存预算约六十四点五兆,低于五百一十二兆上限。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/hq-2048.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/hq-2048.wav",
"durationMs": 22008
},
{
"id": "summary",
"title": "总结与教案",
"narration": "到这里,你已经完成从灰色猴头到六种 PBR 材质的完整流程:打开场景、导入 GLB、分配材质、渲染下载、保存重开,以及诊断、位移、对比相机和高清贴图。更多截图和文字步骤在渲染图文教案里,地址是 tutorial pbr render lesson 点 HTML。",
"mp3": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/summary.mp3",
"wav": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration/summary.wav",
"durationMs": 24936
}
]
}

View File

@@ -0,0 +1,111 @@
{
"schemaVersion": 1,
"status": "PASS",
"gpu": {
"vendor": "Google Inc. (NVIDIA Corporation)",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"gpuMode": "hardware",
"smoke": false,
"durationMs": 669467,
"chapters": [
{
"id": "intro",
"title": "开场:会得到什么",
"startMs": 3630,
"endMs": 39087,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/intro.jpg"
},
{
"id": "open-studio",
"title": "载入摄影棚",
"startMs": 39088,
"endMs": 74925,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/open-studio.jpg"
},
{
"id": "import-glb",
"title": "导入猴头 GLB",
"startMs": 74925,
"endMs": 111990,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/import-glb.jpg"
},
{
"id": "asset-library",
"title": "认识 Shading 与 RE 资产库",
"startMs": 111991,
"endMs": 150022,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/asset-library.jpg"
},
{
"id": "assign-materials",
"title": "分配六种材质",
"startMs": 150022,
"endMs": 283150,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/assign-materials.jpg"
},
{
"id": "render-settings",
"title": "设置渲染",
"startMs": 283150,
"endMs": 317656,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/render-settings.jpg"
},
{
"id": "render-download",
"title": "渲染与下载 PNG",
"startMs": 317656,
"endMs": 378905,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/render-download.jpg"
},
{
"id": "save-reopen",
"title": "保存与重开",
"startMs": 378906,
"endMs": 416940,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/save-reopen.jpg"
},
{
"id": "diagnostics",
"title": "诊断视图与教学曝光",
"startMs": 416941,
"endMs": 492011,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/diagnostics.jpg"
},
{
"id": "displacement",
"title": "位移与细分",
"startMs": 492012,
"endMs": 528899,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/displacement.jpg"
},
{
"id": "camera",
"title": "对比视角",
"startMs": 528900,
"endMs": 562279,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/camera.jpg"
},
{
"id": "hq-2048",
"title": "高清 2048 贴图",
"startMs": 562279,
"endMs": 625129,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/hq-2048.jpg"
},
{
"id": "summary",
"title": "总结与教案",
"startMs": 625130,
"endMs": 665905,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/summary.jpg"
}
],
"errors": [],
"screencast": {
"path": "tests/golden/RE-PBR-VIDEO-001/screencast.webm",
"sha256": "e1ccb9497c851b2a0a3c2fe677b00587e68399340ff956a5bbe54a6bce942778",
"bytes": 42699067
}
}

View File

@@ -0,0 +1,111 @@
{
"schemaVersion": 1,
"status": "PASS",
"gpu": {
"vendor": "Google Inc. (NVIDIA Corporation)",
"renderer": "ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2, OpenGL 4.5.0)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"gpuMode": "hardware",
"smoke": false,
"durationMs": 669467,
"chapters": [
{
"id": "intro",
"title": "开场:会得到什么",
"startMs": 3630,
"endMs": 39087,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/intro.jpg"
},
{
"id": "open-studio",
"title": "载入摄影棚",
"startMs": 39088,
"endMs": 74925,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/open-studio.jpg"
},
{
"id": "import-glb",
"title": "导入猴头 GLB",
"startMs": 74925,
"endMs": 111990,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/import-glb.jpg"
},
{
"id": "asset-library",
"title": "认识 Shading 与 RE 资产库",
"startMs": 111991,
"endMs": 150022,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/asset-library.jpg"
},
{
"id": "assign-materials",
"title": "分配六种材质",
"startMs": 150022,
"endMs": 283150,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/assign-materials.jpg"
},
{
"id": "render-settings",
"title": "设置渲染",
"startMs": 283150,
"endMs": 317656,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/render-settings.jpg"
},
{
"id": "render-download",
"title": "渲染与下载 PNG",
"startMs": 317656,
"endMs": 378905,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/render-download.jpg"
},
{
"id": "save-reopen",
"title": "保存与重开",
"startMs": 378906,
"endMs": 416940,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/save-reopen.jpg"
},
{
"id": "diagnostics",
"title": "诊断视图与教学曝光",
"startMs": 416941,
"endMs": 492011,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/diagnostics.jpg"
},
{
"id": "displacement",
"title": "位移与细分",
"startMs": 492012,
"endMs": 528899,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/displacement.jpg"
},
{
"id": "camera",
"title": "对比视角",
"startMs": 528900,
"endMs": 562279,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/camera.jpg"
},
{
"id": "hq-2048",
"title": "高清 2048 贴图",
"startMs": 562279,
"endMs": 625129,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/hq-2048.jpg"
},
{
"id": "summary",
"title": "总结与教案",
"startMs": 625130,
"endMs": 665905,
"screenshot": "web/app/public/tutorial/pbr/lesson/video-steps/summary.jpg"
}
],
"errors": [],
"screencast": {
"path": "tests/golden/RE-PBR-VIDEO-001/screencast.webm",
"sha256": "e1ccb9497c851b2a0a3c2fe677b00587e68399340ff956a5bbe54a6bce942778",
"bytes": 42699067
}
}

View File

@@ -0,0 +1,22 @@
{
"programs": [
],
"streams": [
{
"codec_name": "h264",
"codec_type": "video",
"width": 1280,
"height": 720
},
{
"codec_name": "aac",
"codec_type": "audio"
}
],
"format": {
"duration": "667.040000",
"size": "13706823"
}
}

View File

@@ -0,0 +1,117 @@
{
"schemaVersion": 1,
"status": "PASS",
"voice": "zh-CN-XiaoxiaoNeural",
"video": {
"path": "/home/mes123456/workinf_Blender_Wasm/web/app/public/tutorial/pbr/lesson/video/re-pbr-lesson-720p.mp4",
"sha256": "6a5b3b51c52945d0594a984ad6b5ff2e557ec319c574679673bd8d6d2a8a2916",
"bytes": 13706823
},
"narration": {
"path": "/home/mes123456/workinf_Blender_Wasm/tests/golden/RE-PBR-VIDEO-001/narration.wav",
"sha256": "adc2658938ad48b278aa434cb9635343491f7241f4632b4af6c9baa9271b9220",
"bytes": 64268876
},
"vtt": {
"path": "/home/mes123456/workinf_Blender_Wasm/web/app/public/tutorial/pbr/lesson/video/re-pbr-lesson.zh-Hans.vtt",
"sha256": "4199af3a9c1ad501ebd7832e43693d43d2bbd30a646a8285343eefc08a237aa3",
"cues": 13
},
"poster": {
"path": "/home/mes123456/workinf_Blender_Wasm/web/app/public/tutorial/pbr/lesson/video/poster.jpg",
"sha256": "6461410e032de2c92f3f898873d9dca9834f2538e65cd0e4b2d8f3c443d0f444"
},
"chapters": [
{
"id": "intro",
"title": "开场:会得到什么",
"startMs": 3630,
"endMs": 23238,
"narration": "这一课我们从灰色猴头开始。你会打开摄影棚,导入只有一个猴头网格的 GLB 文件,从 RE 五零零零 PBR 资产库分配六种材质,最后在浏览器里用显卡渲染、下载 PNG、保存工程并重新打开。"
},
{
"id": "open-studio",
"title": "载入摄影棚",
"startMs": 39088,
"endMs": 59080,
"narration": "先打开 Web Blender 的 Rendering 工作区。在 PBR 渲染练习面板里点击载入练习摄影棚。这个场景已经准备好相机、三点面光、太阳光、世界环境和地面。等待状态栏显示 Engine SceneIR,并且对象数是六。"
},
{
"id": "import-glb",
"title": "导入猴头 GLB",
"startMs": 74925,
"endMs": 96141,
"narration": "接下来点击导入猴头 GLB,选择课程目录里的 monkey head 点 GLB。导入会追加到当前场景,不会替换摄影棚。看到对象数从六变成七,活动对象是 Suzanne 就对了。此时猴头没有材质,所以是灰色的,这是正常的基线。"
},
{
"id": "asset-library",
"title": "认识 Shading 与 RE 资产库",
"startMs": 111991,
"endMs": 134167,
"narration": "切换到 Shading 工作区。左下角是 PBR 资产库,现在有二十个资产。用资产来源下拉框选择 RE 五零零零 PBR,只留下六张材质卡片。单击卡片只会选中,双击才会把材质分配出去。缩略图加载完成后就可以继续。"
},
{
"id": "assign-materials",
"title": "分配六种材质",
"startMs": 150022,
"endMs": 178630,
"narration": "回到 Rendering 工作区。在 PBR 渲染练习面板下方,新加了 RE 五零零零 PBR 材质选择器,它显示完整材质名和缩略图,不受左侧窄栏影响。依次双击六种材质:防滑颗粒、砖墙、随机瓷砖、光亮瓷砖、规则砖墙和做旧砖墙。每次等待材质槽更新,并确认材质球显示 COMPILED。"
},
{
"id": "render-settings",
"title": "设置渲染",
"startMs": 283150,
"endMs": 301798,
"narration": "现在设置渲染。分辨率选一零二四,相机选场景相机,视图保持最终材质,教学曝光保持零,位移强度保持一倍,视角预设选场景相机对齐。这样得到的就是固定摄影棚下的标准成片。"
},
{
"id": "render-download",
"title": "渲染与下载 PNG",
"startMs": 317656,
"endMs": 335968,
"narration": "点击渲染 PBR。面板会先等待纹理和环境贴图就绪,然后输出一张一零二四乘一零二四的 WebGL2 成片。结果出现后,点击下载 PNG,浏览器会保存 pbr 一零二四点 PNG。"
},
{
"id": "save-reopen",
"title": "保存与重开",
"startMs": 378906,
"endMs": 399474,
"narration": "点击顶部的保存项目,下载点 blend 工程。然后再次导入刚才保存的工程;如果询问是否保存当前修改,选择不保存并继续。重新打开后对象数仍是七,材质槽仍然保留做旧砖墙,再渲染一次确认贴图没有丢失。"
},
{
"id": "diagnostics",
"title": "诊断视图与教学曝光",
"startMs": 416941,
"endMs": 437821,
"narration": "深色材质只看整体亮度容易误判。把视图切到 Base Color,可以看到基础色贴图;切到 Normal,可以看到法线和砖缝;切到 Roughness,可以看到粗糙度。教学曝光可以加一档或两档 EV,只改变渲染曝光,不改变材质本身。"
},
{
"id": "displacement",
"title": "位移与细分",
"startMs": 492012,
"endMs": 513060,
"narration": "Height 贴图现在会真正参与几何位移。位移强度一倍保留源材质零点零零一的 Scale,画面变化很细;切到一百倍只是渲染时的教学放大,不写回材质。静帧会把九百六十八个三角形细分到六万一千九百五十二个,再执行位移。"
},
{
"id": "camera",
"title": "对比视角",
"startMs": 528900,
"endMs": 546420,
"narration": "视角预设默认与场景相机精确对齐,所以场景和视口可能看起来一样。选择对比四十五度后,当前视口会以主体为中心偏转三十度,得到明显不同的构图;主视口导航不受影响。"
},
{
"id": "hq-2048",
"title": "高清 2048 贴图",
"startMs": 562279,
"endMs": 584287,
"narration": "如果需要原始分辨率,点击加载高清贴图二零四八。素材会按需合并,材质名带 HQ 后缀。切换到高清来源,双击分配做旧砖墙 HQ,再渲染一次。五个纹理全部加载,显存预算约六十四点五兆,低于五百一十二兆上限。"
},
{
"id": "summary",
"title": "总结与教案",
"startMs": 625130,
"endMs": 650066,
"narration": "到这里,你已经完成从灰色猴头到六种 PBR 材质的完整流程:打开场景、导入 GLB、分配材质、渲染下载、保存重开,以及诊断、位移、对比相机和高清贴图。更多截图和文字步骤在渲染图文教案里,地址是 tutorial pbr render lesson 点 HTML。"
}
]
}