2022-07-04
改めてGPUパワーの凄さを体感したので、調べてみるとライフゲームも凄かった!
(参考、WebGLを使って動かす100万点


「Life Game by WebGL」
src on GitHub forked from aadebdeb/WebGL_LifeGame
WebGLでライフゲームを作る」を元に、window.devicePixelRatio を使って、dot by dotでライフゲームが全画面で動くように改造しました。クリックでフルスクリーン表示します。ウィンドウサイズを変更するたびに、テクスチャーとCanvasのサイズを変更しているので、メモリリークもしていないはず。

ライフゲームのコア部分のGLSLによるプログラムはこちら。

precision mediump float; uniform sampler2D aTexture; uniform vec2 uResolution; varying vec2 vTextureCoordinate; void main() { vec2 scale = 1.0 / uResolution; bool isAlive = texture2D(aTexture, gl_FragCoord.xy * scale).g < 0.5 ? false : true; int sum = 0; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2(-1.0, 1.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2( 0.0, 1.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2( 1.0, 1.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2(-1.0, 0.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2( 1.0, 0.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2(-1.0, -1.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2( 0.0, -1.0)) * scale).g < 0.5 ? 0 : 1; sum += texture2D(aTexture, (gl_FragCoord.xy + vec2( 1.0, -1.0)) * scale).g < 0.5 ? 0 : 1; gl_FragColor = ((isAlive && (sum == 2 || sum == 3)) || (!isAlive && sum == 3)) ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(0.0, 0.0, 0.0, 1.0); }

一つ前の状態がaTextureに入っていて8方向の状態を調べて次の状態を返す。まさにライフゲームのアルゴリズム通りです。C言語や、JavaScriptをやっている人ならそんなに苦労せず書けるはず。

※「precision mediump float」は精度をどう扱うかを示す精度修飾子、lowpでも良さそう(他にhighpが選択可能)。

圧倒的なGPUパワーを使いこなしましょう!

links
- WebGLでライフゲームを作る
- ライフゲーム発明者コンウェイ氏、COVID-19により亡くなる 非WebGL 重かった
- シミュレーション入門 / こどもパソコン IchigoJam でつくるライフゲーム
- Armマシン語でライフゲーム - IchigoJamとRaspberry Pi用IchigoJam RPi(beta)で動く!
- ライフゲームVRにちょうどいいルールを発見! DNA開発環境発表に想う生命とプログラミング
- WebGL で高速に動作するライフゲーム! 膨大なプリセットパターンがすごい! - WebGL 総本山
- deck.gl でライフゲームを作った。 – GUNMA GIS GEEK
- Golgi: ブラウザ上で動く「細胞」風ライフゲームシミュレータ - まめめも
- lifegame 2012年一日一創 非WebGL
- lifegamecb 2012年一日一創 チェックボックス
- lifeart 2012年一日一創 RGBレイヤー

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS