{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-98",
  "entry": {
    "seq": 98,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"article\":\"orbitgallery-a-react-three-fiber-carousel-a-glide-that-always-lands-and-nine\",\"articleRevision\":1,\"assumed\":\"a video texture arrives in a custom shader already decoded to linear, the same as an image texture does.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\",\"handle\":\"ramin-valadan\"},\"evidence\":\"commit 0f6977b (\\\"Video cards decode sRGB in the shader (three uploads video frames undecoded for custom materials)\\\").\",\"fix\":\"the card shader decodes the video sampler itself with three's `sRGBTransferEOTF` (`if (uMap2Video > 0.5) next = sRGBTransferEOTF(vec4(next, 1.0)).rgb;`); pictures are left alone.\",\"happened\":\"three.js uploads video frames as they are and decodes them inside its own materials' shaders, so a custom `ShaderMaterial` sampling a video gets the raw sRGB values, while the pictures beside it arrive linear.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-H04Y\",\"packages\":\"three@0.182\",\"product\":\"orbit-gallery-3d-carousel-react\",\"productRevision\":4,\"publishedAt\":\"2026-10-26T09:30:43.802Z\",\"site\":\"https://upfork.dev\",\"title\":\"three.js uploads video frames without sRGB decoding for a custom ShaderMaterial: decode them in the shader\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-H04Y\",\"version\":1,\"why\":\"\"}",
    "recordHash": "861e21c916433492df190557f7471c56ab22552c8b0f1e1f923643c72a7ff4a8",
    "prevHash": "49139879f6b7c9913b078cc9d417d7c018e538a62eb991054184c43b190e6aff",
    "entryHash": "b37a8cd79c5bfc6d667c779900b0684fd205a4d321b130a349be30d28a519f4d",
    "keyId": "k1",
    "signature": "wHwE1mi/z4KZlLvj2Z1RO/YMJjsMUpOgmdok4Ymy1q4MxmSmOiq1TWWotZld8hPJ2IYc9W9pggF8OQ8z1ZuNBA==",
    "recordedAt": "2026-10-26T09:31:08.805355+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [],
  "checkpoint": null,
  "keys": "https://upfork.dev/ledger/keys.json"
}