<?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: 민준기</title>
    <description>The latest articles on Forem by 민준기 (@_0df0a91eb0881f0450c4e).</description>
    <link>https://forem.com/_0df0a91eb0881f0450c4e</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%2F3894646%2F12bd0517-0b99-42eb-821b-b71bc96f8689.png</url>
      <title>Forem: 민준기</title>
      <link>https://forem.com/_0df0a91eb0881f0450c4e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/_0df0a91eb0881f0450c4e"/>
    <language>en</language>
    <item>
      <title>Why AI-generated fonts don't work in game engines (and the BMFont gap)</title>
      <dc:creator>민준기</dc:creator>
      <pubDate>Tue, 28 Apr 2026 04:48:34 +0000</pubDate>
      <link>https://forem.com/_0df0a91eb0881f0450c4e/why-ai-generated-fonts-dont-work-in-game-engines-and-the-bmfont-gap-5d5</link>
      <guid>https://forem.com/_0df0a91eb0881f0450c4e/why-ai-generated-fonts-dont-work-in-game-engines-and-the-bmfont-gap-5d5</guid>
      <description>&lt;p&gt;Our studio's designer kept running into the same problem: she'd generate a beautiful pixel-art font using an AI image tool, but Godot (and Unity, Phaser, LibGDX) wouldn't accept it.&lt;/p&gt;

&lt;p&gt;The reason is a format mismatch that trips up a lot of indie developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What game engines actually need
&lt;/h2&gt;

&lt;p&gt;Most game engines use &lt;strong&gt;BMFont format&lt;/strong&gt; for bitmap fonts — a standard originally from AngelCode's Bitmap Font Generator. It consists of two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;font.png&lt;/code&gt; — a sprite sheet with all glyphs laid out on a grid&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font.fnt&lt;/code&gt; — a descriptor file that tells the engine where each character is on that sheet, plus kerning pairs and spacing info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without the &lt;code&gt;.fnt&lt;/code&gt; file, the engine has no idea where "A" ends and "B" begins on the sheet. A plain PNG is essentially useless for font rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI tools give you
&lt;/h2&gt;

&lt;p&gt;AI image generators — Midjourney, Stable Diffusion, DALL-E — output a single image. They don't know anything about glyph boundaries, character encoding, or BMFont descriptors. You get a pretty picture of letters, not a usable font asset.&lt;/p&gt;

&lt;p&gt;This gap surprised me when I first encountered it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I ended up solving it
&lt;/h2&gt;

&lt;p&gt;I'm a Spine animator, not a developer — but the problem kept coming up. I started with Python scripts to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take a reference image (pixel art, hand-drawn lettering, etc.)&lt;/li&gt;
&lt;li&gt;Use AI to analyze the visual style and generate all ASCII glyphs in that style&lt;/li&gt;
&lt;li&gt;Lay them out in a spritesheet with proper spacing&lt;/li&gt;
&lt;li&gt;Generate the &lt;code&gt;.fnt&lt;/code&gt; descriptor automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Over several months those scripts evolved into a web tool called CopyPxl (copypxl.com). The output drops directly into Godot's BitmapFont importer, Unity's TextMesh Pro, and Phaser's bitmap font loader.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part: glyph width detection
&lt;/h2&gt;

&lt;p&gt;The trickiest piece was handling variable-width glyphs in pixel art. When letterforms bleed into adjacent cells, automated width detection breaks down.&lt;/p&gt;

&lt;p&gt;Current approach: analyze pixel density per column to find natural glyph boundaries. It works for clean pixel art but struggles with calligraphic or overlapping styles.&lt;/p&gt;

&lt;p&gt;If you've dealt with similar problems — tweaking bitmap font metrics, or working with non-Latin glyph sets — I'd be curious what approaches you've used.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CopyPxl is free to try with a Google sign-in (10 credits). Happy to answer questions about the implementation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>indiedev</category>
      <category>pixelart</category>
    </item>
    <item>
      <title>I built a bitmap font generator as a non-developer — here's how it happened</title>
      <dc:creator>민준기</dc:creator>
      <pubDate>Thu, 23 Apr 2026 16:26:44 +0000</pubDate>
      <link>https://forem.com/_0df0a91eb0881f0450c4e/i-built-a-bitmap-font-generator-as-a-non-develogamedev-indiedev-tools-pixelartper-heres-how-4c42</link>
      <guid>https://forem.com/_0df0a91eb0881f0450c4e/i-built-a-bitmap-font-generator-as-a-non-develogamedev-indiedev-tools-pixelartper-heres-how-4c42</guid>
      <description>&lt;p&gt;I'm not a developer. I'm a Spine animator at a game studio — my job is character animation, not web apps. But a year ago I got so frustrated with a workflow problem that I ended up building a full web tool to solve it.&lt;/p&gt;

&lt;p&gt;This is the story of how &lt;strong&gt;CopyPxl&lt;/strong&gt; happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Our studio's designer loved using AI tools to generate pixel art. The results were genuinely beautiful — retro RPG style lettering, hand-drawn-looking characters, you name it.&lt;/p&gt;

&lt;p&gt;But there was always the same friction at the end: you can't just drop a PNG into Unity or Godot and call it a font. A game engine needs a &lt;strong&gt;bitmap font sheet&lt;/strong&gt; — a grid of every character — plus a &lt;code&gt;.fnt&lt;/code&gt; descriptor file in BMFont format that maps each glyph's position and spacing.&lt;/p&gt;

&lt;p&gt;So every time the designer generated something cool, someone had to manually cut it into individual characters, create the spacing metadata, and export it all in the right format. Hours of work per font.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Python Script
&lt;/h2&gt;

&lt;p&gt;I'm not a developer, but I can write Python. I started with a simple script: take an image, chop it into a grid, output a .fnt file.&lt;/p&gt;

&lt;p&gt;It worked — barely. Hard-coded spacing, no style matching, just mechanical slicing.&lt;/p&gt;

&lt;p&gt;Then I started wondering: what if the AI could generate the full character set in a matching style, not just one letter?&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini + BMFont
&lt;/h2&gt;

&lt;p&gt;I experimented with Gemini's image understanding. If you give it a reference image and describe what you want, it can generate characters that match the aesthetic. Pixel weight, color palette, stroke style — it picks up on these.&lt;/p&gt;

&lt;p&gt;So I built a pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User uploads a reference image&lt;/li&gt;
&lt;li&gt;Gemini analyzes the style and generates a full ASCII character set&lt;/li&gt;
&lt;li&gt;The output gets assembled into a proper BMFont sheet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;.fnt&lt;/code&gt; descriptor format turned out to be simpler than I expected — it's just a text file listing each character's x/y/width/height and kerning. Totally parseable and generatable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning It Into a Web App
&lt;/h2&gt;

&lt;p&gt;Here's where it got interesting. I had a working Python script, but my designer couldn't run it — they don't use terminals.&lt;/p&gt;

&lt;p&gt;I needed a web interface. I had zero web development experience.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Claude&lt;/strong&gt; came in. I described what I wanted: upload an image, run the pipeline, download a ZIP. Claude helped me build the Flask backend, the frontend, the credit system, and the Google OAuth integration. I'd write requirements in plain language; it would translate them into code I could understand and modify.&lt;/p&gt;

&lt;p&gt;It took a few months of evenings and weekends. The result: &lt;a href="https://copypxl.com" rel="noopener noreferrer"&gt;copypxl.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What CopyPxl Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upload any reference image (pixel art, hand-drawn lettering, retro screenshots)&lt;/li&gt;
&lt;li&gt;AI generates a full ASCII character set in matching style&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;font.png&lt;/code&gt; + &lt;code&gt;font.fnt&lt;/code&gt; — drop into Unity (TextMesh Pro or legacy), Godot 3.x/4.x, Phaser, or LibGDX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No plugin needed. Standard BMFont format that every major engine already supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Building a side project as a non-developer taught me things I wouldn't have encountered in my day job:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API design matters.&lt;/strong&gt; Gemini's API has a learning curve. Prompt engineering for consistent glyph output took the most iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free tiers will break your heart.&lt;/strong&gt; I went through two hosting providers before settling on one that doesn't cold-start in the middle of a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;People notice the story more than the product.&lt;/strong&gt; My best traction came from explaining &lt;em&gt;why&lt;/em&gt; I built this — the animator-who-needed-a-font angle landed better than technical feature lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;CopyPxl is live at &lt;a href="https://copypxl.com" rel="noopener noreferrer"&gt;copypxl.com&lt;/a&gt; — free to try with 10 credits on Google sign-in, no card required.&lt;/p&gt;

&lt;p&gt;If you're a game dev who's ever stared at a beautiful piece of AI art and thought "I wish I could use this as a font" — that's exactly who I built it for.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the build, the AI pipeline, or what it's like shipping a web product as someone who came from animation.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>gamedevindiedevpixelart</category>
    </item>
  </channel>
</rss>
