About me
GPGPU で並列化した大規模シミュレーションや,リアルタイムレンダリングを実装することが好きです.特に,それらをブラウザ上で実現することにこだわりがあります.最近では,WebGPU のコンピュートシェーダーを用いて,ブラウザ上で動作する GPGPU 並列化したシミュレーションを実装することに取り組んできました (See Works!).
また,作品を作るために用いた技術について記事を執筆し,発信することも好きです (See Articles!).X で実装の途中過程も随時発信しているので,よろしければご覧ください.
実装したプロジェクトのソースコードは,すべて GitHub で公開しています.
Works
以下のデモはすべてブラウザ上で動作します(一部のデモは WebGPU 対応が必要です).
WebGPU-Ocean
WebGPU で実装した,MLS-MPM による流体シミュレーションをデプロイしました.ブラウザ上で動きます.SPH よりもかなり高速です./ A MLS-MPM fluid simulation in WebGPU has been deployed!
— matsuoka-601 (@matsuoka_601) January 10, 2025
demo : https://t.co/Dm8QTxo6gO
repo : https://t.co/X0I484K4i5 pic.twitter.com/wW1Gn3pXEo
WebGPU を用いて,ブラウザ上で動作するリアルタイム流体シミュレーションを実装しました.シミュレーションは,2018 年に Hu らによって提案された MLS-MPM という新しい手法を,GPGPU で並列化したものを用いています.ブラウザ上で動作する流体シミュレーションとしては,自分が知る限りでは現時点で最大クラスの規模のものです.
- デモ : WebGPU-Ocean
- GitHub : WebGPU-Ocean
- 解説記事 : WebGPU で MLS-MPM を実装し,ブラウザ上で 10 万粒子規模のリアルタイムシミュレーションを実現する
- CG 関連の外部サイトにも掲載していただきました.
WaterBall
Deployed a new real-time fluid simulation - "waterball"!
— matsuoka-601 (@matsuoka_601) February 3, 2025
Interact with the water on a sphere🌏.
demo : https://t.co/HLyL5OtTwQ
repo : https://t.co/RKji8V6IbG
The demo runs smoothly even on my 6-year-old iPad! (see the reply) pic.twitter.com/qCC9Pj1Uqw
球体上の流体シミュレーションに挑戦しました.WebGPU-Ocean と同じく,MLS-MPM を GPGPU 並列化したものを用いており,高速です.
Splash
Deployed a new fluid simulation - "Splash"!
— matsuoka-601 (@matsuoka_601) March 21, 2025
- Cleaner fluid surface thanks to Narrow-Range Filter
- Shadows using ray marching (particles mode only)
- More interaction (see the video)
Enjoy!
demo: https://t.co/F00L9XiD7b
repo: https://t.co/Zqxy4QDnAc pic.twitter.com/tqv8WTcIfw
WebGPU-Ocean をさらに発展させた流体シミュレーションです.2018 年に提案された Narrow-Range Filter という手法を用いて,流体表面をより美しくレンダリングし,さらにレイマーチングによる影の表現も行いました.パフォーマンスもさらに向上させ,GPU によってはブラウザ上で 100 万粒子規模のリアルタイムシミュレーションも可能です.
- デモ : Splash
- GitHub : Splash
- 解説記事 : Splash: A Real-Time Fluid Simulation in Browsers Implemented in WebGPU
Wasm-Slime
Rust + wasm-bindgen-rayon を用いて,ブラウザ上で動作する並列流体シミュレーションを実装しました.マルチスレッドによる並列化により,シングルスレッドだけで達成するのが困難なスケールのシミュレーションを実現しました.
- デモ : Wasm-Slime
- GitHub : Wasm-Slime
- 解説記事 : ブラウザ上でヌルヌル動作する流体シミュレーションを Rust + wasm-bindgen-rayon で実装する
Coupling fluid & softbody simulation (WIP)
Position Based Dynamics という手法を用いて,流体とソフトボディを融合したシミュレーションを実装することに挑戦しています.
Articles
作った作品に関する技術の発信を,英語・日本語を問わず行っています.
WebGPU Fluid Simulations: High Performance & Real-Time Rendering
ハイパフォーマンスな 3D 流体シミュレーションをブラウザ上で実現するために用いた技術について,Codrops という企業から依頼をいただき書いた記事です.記事の紹介ツイートは 2000 いいねを超えるなど,話題になりました.
When @matsuoka_601 dropped his WebGPU fluid simulation demos, they left everyone in awe—pushing the limits of what's possible in the browser with breathtaking realism and incredible performance. 💦
— Codrops (@codrops) February 26, 2025
Now, he's been kind enough to take us behind the scenes, breaking down the magic… pic.twitter.com/YBnABYnpFS
Splash: A Real-Time Fluid Simulation in Browsers Implemented in WebGPU
作品の 1 つである Splash を紹介するために,英語掲示板である reddit に書いた記事です.1400 以上の upvote をいただき,r/GraphicsProgramming というサブレディットの中で歴代 5 番目に注目された記事となっています(2025/05/25 現在).
Splash: A Real-Time Fluid Simulation in Browsers Implemented in WebGPU
byu/matsuoka-601 inGraphicsProgramming
Zenn
Zenn にも積極的に記事を投稿しています.
- ブラウザ上でヌルヌル動作する流体シミュレーションを Rust + wasm-bindgen-rayon で実装する
- WebGPU で実装したリアルタイム 3D 流体シミュレーションの紹介
- WebGPU で MLS-MPM を実装し,ブラウザ上で 10 万粒子規模のリアルタイムシミュレーションを実現する
- 爆速な素数判定の怪
Skills
WebGPU (WGSL)
WGSL のコンピュートシェーダーを用いて,GPGPU を用いた,ブラウザ上で動作する大規模な物理シミュレーションを作ってきました.
WebGL では難しかった GPGPU 最適化の中には,WebGPU のコンピュートシェーダーのおかげで書きやすくなっているものが多くあります.そのため,将来的には,WebGPU によってブラウザ上でできることの幅が大きく広がりうると予想しています.
Three.js & WebGL (GLSL)
Three.js や GLSL を用いてレンダリングしたシミュレーションも作成中です。
流体はメタボールという手法でレンダリングしています。また、緑色のソフトボディは、2D 空間上で擬似的な法線を計算し、屈折やスペキュラを計算することで、あたかも 3D 空間上の物体であるかのように再現しています。
SIMD を用いた高速化
プログラムの高速化のコンペティションサイトである highload.fun に趣味で参加しています.AVX2 という SIMD の命令セットを用いて,プログラムを極限まで高速化することに挑戦しています.以下が成績の一部です(いずれも 2025/05/25 時点).
- Parse Integers : 3 位(735 人中)
- Unique Strings : 3 位(215 人中)
- Format Integers : 2 位(69 人中)
- Fizz Buzz : 1 位(68 人中)
- Large Integer Multiplication : 1 位(42 人中)
最近では wasm の SIMD サポートも充実してきているため,SIMD 最適化されたシミュレーションやアプリケーションをブラウザ上で動かすことにも挑戦したいと考えています.
競技プログラミング
大学時代は,趣味として競技プログラミングをしていました.データ構造やアルゴリズムに関する知識を応用して,問題を解くのが好きです(アカウント : SPARKLE).
TypeScript
ここまでに紹介した,ブラウザ上のアプリケーションはすべて TypeScript で実装しています.
Rust
Rust と wasm-bindgen-rayon を用いて,ブラウザ上で動作する並列流体シミュレーションを実装しました.紹介記事はこちら
C++
競技プログラミングや highload.fun のコンペティションには C++ で参加しています.