<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Takumi Chiba</title>
    <description>The latest articles on Forem by Takumi Chiba (@chibataku0815).</description>
    <link>https://forem.com/chibataku0815</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F343289%2Fd468f780-0115-4850-847b-5ea5168ed7f8.jpeg</url>
      <title>Forem: Takumi Chiba</title>
      <link>https://forem.com/chibataku0815</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/chibataku0815"/>
    <language>en</language>
    <item>
      <title>How to build a film look in a renderer without just adding grain</title>
      <dc:creator>Takumi Chiba</dc:creator>
      <pubDate>Wed, 20 May 2026 11:33:50 +0000</pubDate>
      <link>https://forem.com/chibataku0815/how-to-build-a-film-look-in-a-renderer-without-just-adding-grain-3h14</link>
      <guid>https://forem.com/chibataku0815/how-to-build-a-film-look-in-a-renderer-without-just-adding-grain-3h14</guid>
      <description>&lt;p&gt;A film look does not come from adding grain at the end of a pipeline.&lt;/p&gt;

&lt;p&gt;Grain matters, but it only works when it belongs to the rendered image. If the color response is brittle, the grain ignores image density, or particle size only makes noise louder, the result does not become more film-like. It just becomes noisier.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How should color response, image density, and grain particles work together?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the renderer boundary I changed in Filmtone Desktop v1.13.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;For this release, I treated film look as a relationship between four parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;color response
  + image-density response
  + particle scale
  + particle density
  = texture that belongs to the image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filmtone Desktop v1.13 changes the native renderer in three places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;built-in Stone, Urban, and Noir now carry an internal Exposure / Density Color Response stage;&lt;/li&gt;
&lt;li&gt;grain moved away from direct RGB noise toward a density-domain particle model;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Grain Size&lt;/code&gt; now feeds an internal Texture Engine:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Texture = ScalingField(image) * ParticleField(seed, params)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No new grain panel. No sidecar schema change. No export workflow change.&lt;/p&gt;

&lt;p&gt;The point was to improve the model before adding more controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "add noise" breaks down
&lt;/h2&gt;

&lt;p&gt;The simplest grain implementation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output.rgb = graded.rgb + noise.rgb * amount
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can be useful as a debug view, but it has a predictable visual failure: the noise does not know anything about the image it is being applied to.&lt;/p&gt;

&lt;p&gt;On smooth bright surfaces, it can read as a layer of speckle. On skin or saturated colors, independent RGB movement can become colored dirt. In dense shadows, grain can turn into muddiness instead of texture.&lt;/p&gt;

&lt;p&gt;The failure is not just amplitude. Turning the slider down hides the problem, but it also removes the texture.&lt;/p&gt;

&lt;p&gt;The model needs better boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Color response before grain
&lt;/h2&gt;

&lt;p&gt;If a strong grade already separates color too harshly, grain will amplify the breakpoints.&lt;/p&gt;

&lt;p&gt;In Filmtone Desktop v1.13, the built-in Stone, Urban, and Noir paths now include an internal Exposure / Density Color Response stage. This is not a new user-facing control. It is a renderer-stage change inside the built-in preset path.&lt;/p&gt;

&lt;p&gt;Imported LUTs and custom grade paths stay neutral unless they explicitly opt into this response in a future release.&lt;/p&gt;

&lt;p&gt;The goal is simple: make the color response hold together before particles are added.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Grain as a density-domain particle model
&lt;/h2&gt;

&lt;p&gt;The next change was to stop treating grain as unrelated RGB pixels sprinkled over the frame.&lt;/p&gt;

&lt;p&gt;The release moves the built-in grain path toward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mostly luma/density residual
weak correlated dye variation
no independent RGB color dirt
procedural particle structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a full film-emulsion simulation. Filmtone Desktop v1.13 does not ship scanned grain plate libraries, measured stock profiles, or a claim of physical film accuracy.&lt;/p&gt;

&lt;p&gt;The narrower goal is more useful for this release: make procedural grain behave more like image texture and less like an overlay.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Splitting where texture appears from what particles are
&lt;/h2&gt;

&lt;p&gt;The larger internal change is the Texture Engine shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Texture = ScalingField(image) * ParticleField(seed, params)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ScalingField&lt;/code&gt; answers where the texture should be visible. For grain, it is image-dependent: highlights, mid tones, and shadows should not all carry particles the same way.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ParticleField&lt;/code&gt; answers what the texture looks like. It owns particle size, density, variation, and stochastic structure.&lt;/p&gt;

&lt;p&gt;That split matters because grain size is not the same thing as grain amount.&lt;/p&gt;

&lt;p&gt;If increasing &lt;code&gt;Grain Size&lt;/code&gt; only makes the noise coarser or louder, bright smooth areas quickly become uniform digital spray. The renderer needs a morphology axis: as particles get larger, particle density should be able to change too.&lt;/p&gt;

&lt;p&gt;In v1.13, &lt;code&gt;Grain Size&lt;/code&gt; feeds this Texture Engine so the renderer can trade particle density for particle scale. Bright areas can hold fewer, larger particles instead of only gaining more speckle.&lt;/p&gt;

&lt;p&gt;The core path looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graded image
  |
  v
internal color / density response
  |
  v
ScalingField(image)         ParticleField(seed, params)
        |                          |
        +------ texture = scaling * particles
                           |
                           v
                 density-domain grain response
                           |
                           v
                       output image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this stayed internal
&lt;/h2&gt;

&lt;p&gt;I did not add more controls for this release because the public UI was not the problem.&lt;/p&gt;

&lt;p&gt;The old model could fail even with reasonable control values. Adding more sliders would have asked the user to compensate for renderer behavior that should be handled inside the image pipeline.&lt;/p&gt;

&lt;p&gt;So the public surface stayed stable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;existing controls;&lt;/li&gt;
&lt;li&gt;existing saved settings;&lt;/li&gt;
&lt;li&gt;existing sidecars;&lt;/li&gt;
&lt;li&gt;existing export workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The renderer changed underneath the built-in Stone, Urban, and Noir paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundaries
&lt;/h2&gt;

&lt;p&gt;A few boundaries are important.&lt;/p&gt;

&lt;p&gt;Filmtone Desktop v1.13 is a public Desktop release, not an iOS release announcement. Filmtone's iOS public App Store version is a separate release axis.&lt;/p&gt;

&lt;p&gt;This release also does not claim parity with named film-emulation tools. It uses familiar ideas from grain synthesis and procedural particle models, but the shipped behavior is Filmtone's own native renderer path.&lt;/p&gt;

&lt;p&gt;Print Material speck and Backlight Veil mottle are not public texture surfaces in this release. The Texture Engine foundation is used for grain first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;If I had to reduce the implementation lesson to one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A film look needs grain to be part of image formation, not a noise layer after it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Filmtone Desktop v1.13, that meant color response first, density-domain grain second, and a Texture Engine that separates where texture appears from what the particles are.&lt;/p&gt;

&lt;p&gt;Small UI release. Meaningful renderer change.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://www.chibatakumi.studio/filmtone?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=grain_fit_dev" rel="noopener noreferrer"&gt;Try Filmtone in your browser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.chibatakumi.studio/filmtone/download?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=grain_fit_dev" rel="noopener noreferrer"&gt;Download Filmtone Desktop for Mac&lt;/a&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>showdev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Making creative LUTs safer for Rec.709 video</title>
      <dc:creator>Takumi Chiba</dc:creator>
      <pubDate>Sun, 17 May 2026 12:08:39 +0000</pubDate>
      <link>https://forem.com/chibataku0815/making-creative-luts-safer-for-rec709-video-5bnm</link>
      <guid>https://forem.com/chibataku0815/making-creative-luts-safer-for-rec709-video-5bnm</guid>
      <description>&lt;p&gt;A strong creative LUT can look great on the footage it was designed around.&lt;br&gt;
That does not mean it should hit every source the same way.&lt;/p&gt;

&lt;p&gt;This was the problem behind the latest Filmtone Desktop release.&lt;/p&gt;

&lt;p&gt;Filmtone has built-in creative Looks named Stone, Urban, and Noir. They are&lt;br&gt;
designed to do more than a tiny color nudge: they can move contrast, hue,&lt;br&gt;
saturation, glow, softness, and the optical finish of the image.&lt;/p&gt;

&lt;p&gt;That is useful when the source is ready for a creative transform.&lt;/p&gt;

&lt;p&gt;It is less useful when the source has already been rendered for display.&lt;/p&gt;
&lt;h2&gt;
  
  
  The source is part of the color decision
&lt;/h2&gt;

&lt;p&gt;Rec.709 footage is often already opinionated.&lt;/p&gt;

&lt;p&gt;It may already have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;display contrast baked in;&lt;/li&gt;
&lt;li&gt;saturation pushed into a consumer-friendly range;&lt;/li&gt;
&lt;li&gt;highlights compressed into a smaller space;&lt;/li&gt;
&lt;li&gt;skin and sky colors that are usable, but not very flexible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a full creative LUT is applied directly on top of that, the failure mode is&lt;br&gt;
easy to recognize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;highlight color breaks;&lt;/li&gt;
&lt;li&gt;skin shifts too far;&lt;/li&gt;
&lt;li&gt;saturation feels harsh;&lt;/li&gt;
&lt;li&gt;dark color separation collapses;&lt;/li&gt;
&lt;li&gt;lowering the whole LUT intensity makes the result safer, but also makes the
Look less useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tempting fix is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the source is Rec.709, reduce LUT intensity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That helped, but it was not enough.&lt;/p&gt;

&lt;p&gt;It made the transform less aggressive, but it did not change the shape of the&lt;br&gt;
transform. The same hue and saturation moves were still there, just blended&lt;br&gt;
back toward the source.&lt;/p&gt;
&lt;h2&gt;
  
  
  What changed in Filmtone Desktop 1.12
&lt;/h2&gt;

&lt;p&gt;Filmtone Desktop 1.12 adds dedicated Rec.709-safe variants for the built-in&lt;br&gt;
Stone, Urban, and Noir Looks.&lt;/p&gt;

&lt;p&gt;On Rec.709, SDR BT.709, Display P3 SDR, or unknown display-referred sources,&lt;br&gt;
the Desktop renderer now chooses a safer Look variant instead of only lowering&lt;br&gt;
the full Look intensity.&lt;/p&gt;

&lt;p&gt;The intent is not to make the result flat.&lt;/p&gt;

&lt;p&gt;The intent is to keep the useful parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;glow;&lt;/li&gt;
&lt;li&gt;softness;&lt;/li&gt;
&lt;li&gt;grain and finish controls;&lt;/li&gt;
&lt;li&gt;before/after comparison;&lt;/li&gt;
&lt;li&gt;playback review before export.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And pull back the parts that break fastest on already-rendered footage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strong hue travel;&lt;/li&gt;
&lt;li&gt;saturation spikes;&lt;/li&gt;
&lt;li&gt;aggressive highlight color shifts;&lt;/li&gt;
&lt;li&gt;compression moves that were tuned for a different source state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Full Looks still matter
&lt;/h2&gt;

&lt;p&gt;This does not mean every source should be treated like Rec.709.&lt;/p&gt;

&lt;p&gt;If the footage is normalized through an explicit Log or camera profile path,&lt;br&gt;
Filmtone keeps the full Creative Pack 01 Look behavior.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;The product should not flatten all sources into one generic safe path. A Log&lt;br&gt;
clip waiting for normalization is not the same starting point as an iPhone or&lt;br&gt;
camera file that has already been rendered for display.&lt;/p&gt;

&lt;p&gt;Filmtone now keeps those paths separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source profile / source state -&amp;gt; base grade -&amp;gt; optical finish -&amp;gt; creative Look decision -&amp;gt; export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Preview and export must agree
&lt;/h2&gt;

&lt;p&gt;The other important part is less visible, but more important for trust.&lt;/p&gt;

&lt;p&gt;Preview, still export, video export, and video composition rendering all resolve&lt;br&gt;
the same source-aware built-in Look variant.&lt;/p&gt;

&lt;p&gt;That means if a Rec.709-safe preview is shown, the export path uses the same&lt;br&gt;
decision.&lt;/p&gt;

&lt;p&gt;For a finishing tool, that matters more than having a long feature list. The&lt;br&gt;
basic promise is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What you judge in playback should be the thing you export.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where this fits
&lt;/h2&gt;

&lt;p&gt;Filmtone is not a full editing suite replacement.&lt;/p&gt;

&lt;p&gt;It is a smaller tool for a smaller moment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a clip.&lt;/li&gt;
&lt;li&gt;Choose a Preset or Look.&lt;/li&gt;
&lt;li&gt;Compare while the footage moves.&lt;/li&gt;
&lt;li&gt;Adjust only what the footage asks for.&lt;/li&gt;
&lt;li&gt;Export on Mac when the result is ready.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Rec.709-safe variants make that path more reliable for the kind of footage&lt;br&gt;
people already have: phone clips, camera files, SDR exports, and footage that&lt;br&gt;
is technically usable but not yet finished.&lt;/p&gt;

&lt;p&gt;If you work with video and LUTs, I would like feedback on whether this split&lt;br&gt;
matches how you think about source material.&lt;/p&gt;

&lt;p&gt;Try Filmtone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser demo:
&lt;a href="https://www.chibatakumi.studio/en/filmtone?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts" rel="noopener noreferrer"&gt;https://www.chibatakumi.studio/en/filmtone?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mac download:
&lt;a href="https://www.chibatakumi.studio/en/filmtone/download?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts" rel="noopener noreferrer"&gt;https://www.chibatakumi.studio/en/filmtone/download?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product / release notes:
&lt;a href="https://www.chibatakumi.studio/en/filmtone/release-notes?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts" rel="noopener noreferrer"&gt;https://www.chibatakumi.studio/en/filmtone/release-notes?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rec709_safe_luts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Product Hunt launch will follow after this article has collected some early&lt;br&gt;
feedback.&lt;/p&gt;

</description>
      <category>video</category>
      <category>macos</category>
      <category>indiehackers</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
