C# Async Task Notes
In 2025, writing asynchronous code with C# Async Tasks is a skill Unity developers can no longer avoid. Unity’s support for C# async tasks goes back as far as Unity 2017, although fewer people used it at the time. This post records my experiments implementing a MyTask class and using it in Unity to understand how C# achieves asynchronous execution. I learned from Stephen Toub’s Deep .NET: Writing async/await from scratch in C# with Stephen Toub and Scott Hanselman and his post How Async/Await Really Works in C#.
2024 Reflection
Today is the only day on which I can write my annual reflection, so I am taking the opportunity to review this year’s progress and next year’s plans.
Things I accomplished Attended a Japanese language school Passed JLPT N2 (I passed N3 in July 2023) Created, published, and began selling a toon-rendering shader plugin Developed an FF9 shader mod Shader-related side projects (SSR, a Hi-Fi Rush-inspired modification to Unity’s deferred-rendering pipeline, a GPU path tracer, and probe-based GI) Studied the Unity 6 RenderGraph API Found a job in Japan (starting in 2025) Things I did not accomplish JLPT N1 (the results are not out yet, but I probably did not pass) Speaking Japanese fluently, expanding my vocabulary, and learning more programming terminology I did not play enough games seriously (the ones I completed seriously were FF9, Unicorn Overlord, Tales of Arise, Tactics Ogre, and Ys VIII) I am still terrible at Python Impressions of Japan After arriving in Japan, I became acutely aware of the gap between Taiwan and other countries. Although the yen has depreciated to the point where the salaries of ordinary Japanese office workers are now close to those in Taiwan, the gap in resources is still enormous. For entertainment, culture, and learning, Japan has far richer resources than Taiwan, both physical and online. For example, when I was in Taiwan and wanted to search for technical articles about Unity, game engines, or rendering, I often had to rely on Chinese websites such as Zhihu to find material that went deep enough. Japan also has a huge amount of online material in these areas鈥攖here are simply enough people competing to produce it. (I can only understand less than 30% of it right now, so I often have to look for an English explanation afterward.) There are also many large bookstores specializing in technical books, and buying books (as well as standing around reading manga) is a popular pastime.
A New Look for a Classic鈥擬odifying FF9's Shaders
Introduction This post records how I used the Memoria mod for Final Fantasy 9 (FF9) to modify the shaders used by the game, giving its characters and scenes a completely different feel. It covers my analysis of FF9’s shaders and the process and ideas behind introducing per-pixel lighting into a game constrained by low model polygon counts and limited real-time lighting methods.
I first played FF9 at home when I was eight years old, and it eventually became the reason I entered the game industry. I am now happily replaying FF9 with my own mod. This time I hope to collect every weapon and achievement except Excalibur II.
A Review of the Second Half of 2023
About the second half of the year At the beginning of August, I left the company where I had worked for nearly eight years. The reason was that, barring any surprises, I would be going to Japan to attend a language school for a year at the end of next March. I was a little sad to leave (and to give up some income), but I resigned almost half a year early because I wanted to work on the important but not urgent things I had been accumulating over the years.
Using AMD FSR 2.0 in Unity
AMD FSR and NVIDIA DLSS are both upscaling technologies. They let a game render at a lower native resolution while retaining image quality similar to a higher resolution. In an era full of real-time RT, SSGI, and SSR, they can significantly improve game performance.
Unity’s built-in support only covers FSR 1.0 and DLSS 1.0. The reconstructed image quality of DLSS 2 and FSR 2.0 is far better than the previous generation (although FSR 2.0 has a higher baseline performance cost than FSR 1). Integrating these features from scratch requires graphics-backend API skills such as Vulkan or DX12. Fortunately, AMD released a ready-made DX11 patch for Unity, so I decided to try it. This post records the DLLs needed for the build and the process of applying the patch to Unity.