<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>実験 on ながむしメモ</title><link>https://nagakagachi.github.io/lab/webgpu/experiments/</link><description>Recent content in 実験 on ながむしメモ</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Sun, 25 Oct 2026 21:05:26 +0900</lastBuildDate><atom:link href="https://nagakagachi.github.io/lab/webgpu/experiments/index.xml" rel="self" type="application/rss+xml"/><item><title>TerrainRendering00</title><link>https://nagakagachi.github.io/lab/webgpu/experiments/terrain-rendering00/</link><pubDate>Sun, 25 Oct 2026 21:05:26 +0900</pubDate><guid>https://nagakagachi.github.io/lab/webgpu/experiments/terrain-rendering00/</guid><description>&lt;p&gt;学習用にAgentCodingで生成したデモです&lt;/p&gt;&#10;&lt;p&gt;プロシージャルに生成した地形を、カメラに追従する共有グリッドで描画します。標高は1024²固定のFP16 Height Clipmapへ保持し、移動で露出した帯だけをGPUで更新します。標高データファイルを配布せず、地形生成・差分更新・カリングをGPUで行う構成を試しています。&lt;/p&gt;&#10;&lt;h2 id="操作方法"&gt;操作方法&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「実行」で開始。初期カメラはXYZ=(0, 200, 0)m、水平向きです&lt;/li&gt;&#10;&lt;li&gt;ビューをクリックし、WASDで前後左右、Q/Eで上下、Shiftで加速。ドラッグ・矢印キーで回転、ホイールで前後移動します&lt;/li&gt;&#10;&lt;li&gt;シード・標高振幅・山スケールを変更し、「地形を再生成」で反映します。同じパラメータなら同じ場所に同じ地形が生成されます&lt;/li&gt;&#10;&lt;li&gt;セルスナップ、法線、ワイヤーフレーム、タイル色分けを切り替えられます。初期ワイヤーはOFF、カバー半径は16kmです&lt;/li&gt;&#10;&lt;li&gt;「カリング・配置をフリーズ」は標高キャッシュも固定します。カメラだけ動かして、固定された可視タイルを外から観察できます&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;WebGPU対応ブラウザで実行してください。操作はキーボードとマウスを使うPC向けです。初回と地形再生成時は標高窓全体を計算するため、表示まで少し待つことがあります。&lt;/p&gt;&#10;&lt;p&gt;初期値はシード &lt;strong&gt;12343725&lt;/strong&gt;、標高振幅 &lt;strong&gt;2000m&lt;/strong&gt;、山スケール &lt;strong&gt;3100m&lt;/strong&gt;。振幅は地形関数のスケールであり、標高の最大値そのものではありません。灰色から白の濃淡で標高を表し、陰影で起伏を確認できます。カメラは地形との衝突判定を行わないので、地中に入った場合はQ/Eで高度を変えるか「カメラを戻す」を使ってください。&lt;/p&gt;&#10;&lt;h3 id="比較するときの見方"&gt;比較するときの見方&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;タイル色分け＋ワイヤーフレーム&lt;/strong&gt;：近くは細かく、遠くは粗い格子になる配置と接続を確認します&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;セルスナップOFF&lt;/strong&gt;：カメラ移動に合わせて標高の参照位置が連続変化する様子を比較します。ONでは各段のセル間隔に合わせて配置を動かします&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;タイル密度&lt;/strong&gt;：同じ範囲を4×4、8×8、16×16のタイルで覆います。1タイル64×64セルは固定で、密度を上げるとワールド空間のセルが細かくなります。標高キャッシュの最細間隔は1mのままです&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;カバー半径&lt;/strong&gt;：指定範囲を覆う最小限のLOD段数を使います。段数は離散的なので、実際の配置範囲は指定値より広くなる場合があります&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;フラスタムカリング＋フリーズ&lt;/strong&gt;：フリーズ後にカメラを回すと、元の視点から見えなかったタイルが描画対象から外れていることを観察できます。フリーズ中は標高窓も移動しないため、地形を追いかける通常の移動には解除してください&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;法線表示・可視リスト集約&lt;/strong&gt;：法線の接続状態や、subgroup経路とworkgroup経路の描画結果を比較できます。機能の切替だけで速度差を断定できるものではありません&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;!-- demo --&gt;&#10;&lt;h2 id="標高の生成"&gt;標高の生成&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-wgsl" data-lang="wgsl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;heights[word]&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;pack2x16float(vec2f(first,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;second));&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Compute Shaderで標高を計算し、2サンプルを1個のuint32へ詰めます。格納形式はIEEE 754のFP16、計算はFP32です。shader-f16や追加のテクスチャ形式機能は要求しません。VSではunpack2x16floatでFP32へ戻し、双線形補間します。テクスチャのハードウェア補間は使いません。&lt;/p&gt;&#10;&lt;p&gt;1 invocationがX方向に隣接する2サンプルの書込先を所有します。窓原点のXも2サンプル刻みにし、矩形の境目で同じuint32を競合更新しないようにしています。標高生成にはAtomicを使いません。&lt;/p&gt;&#10;&lt;p&gt;地形関数は低周波の山塊、Domain Warp、Ridged noiseの複数帯域から構成します。粗い標高段ではサンプル間隔に対して高すぎる周波数を滑らかに落とし、不要なノイズ帯域の評価も省きます。これは生成関数の帯域を抑える近似であり、厳密な低域通過フィルタではありません。高周波を省いた分で残りの振幅を再正規化せず、大きな地形の振幅を維持します。&lt;/p&gt;&#10;&lt;p&gt;CPUは矩形・シード・スケールなどの生成条件を渡すだけです。CPUで標高を作ったり、標高面を読み戻して描画したりする処理はありません。&lt;/p&gt;&#10;&lt;h2 id="1024の固定窓とトロイダル更新"&gt;1024²の固定窓とトロイダル更新&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;const&lt;/span&gt; rects &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; updateRects(previous, next);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各標高段は常に1024×1024サンプルです。原点をセル単位で移動し、前の窓と重なる領域を再利用します。露出したX方向の帯と、その帯を除いたZ方向の帯を生成するため、斜め移動でも二重書き込みはありません。1窓分以上の移動とパラメータ変更時は全生成し、静止中の更新は0です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-wgsl" data-lang="wgsl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;let&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;physical&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;vec2u(cell)&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;vec2u(&lt;span style="color:#a5d6ff"&gt;1023u&lt;/span&gt;);&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;世界の標高格子を循環バッファの位置へ写します。1024²なので剰余をビットマスクにできます。負座標も同じ規則で扱います。循環するのは格納場所だけで、地形の周期ではありません。生成関数は常に世界座標とシードを参照するため、窓が動いても同じ場所の値は変わりません。&lt;/p&gt;&#10;&lt;p&gt;更新条件は48バイト/矩形、動的Uniformの配置間隔は256バイトです。最大2矩形/段を同じCompute Passへ発行します。矩形間の書込先は重なりません。生成Pass完了後にタイルカリングと描画を行い、更新途中の標高をVSから読みません。&lt;/p&gt;&#10;&lt;h2 id="メッシュlodと標高lod"&gt;メッシュLODと標高LOD&lt;/h2&gt;&#10;&lt;p&gt;メッシュと標高窓は別に管理します。各段の半幅を128mから倍増させるメッシュLODに対して、標高の最細間隔は1mです。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;メッシュ段&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;標高段&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;標高間隔&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0・1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64m&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;各窓は対応するメッシュ範囲より広く取り、段別スナップ・双線形補間・法線参照の余裕を持ちます。タイル密度4/8/16を変えても、同じメッシュ段で使う標高窓の解像度は変えません。&lt;/p&gt;</description></item><item><title>ボクセル環境シミュレーション</title><link>https://nagakagachi.github.io/lab/webgpu/experiments/voxel-ecosystem/</link><pubDate>Mon, 19 Oct 2026 22:12:56 +0900</pubDate><guid>https://nagakagachi.github.io/lab/webgpu/experiments/voxel-ecosystem/</guid><description>&lt;p&gt;学習用にAgentCodingで生成したデモです&lt;/p&gt;&#10;&lt;p&gt;128×64×128の地形上に、少数の植物ボクセルを生成します。植物は光からエネルギーを得て上や横へ伸び、他の植物を遮光します。日陰では隣接する植物からの供給と維持費の釣り合いによって生存が決まり、枯れた場所には再び光が差し込みます。森林の生理を再現するモデルではなく、光を奪い合う群体の簡略モデルです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「実行」で開始、「停止」で更新と連続描画を止めます&lt;/li&gt;&#10;&lt;li&gt;ドラッグで回転、ホイールや2本指のピンチで接近・後退します。カメラは透視投影です&lt;/li&gt;&#10;&lt;li&gt;シードには0〜4,294,967,295の整数を入力し、「再生成」で適用します。「別シード」は新しい値を選んで再生成します&lt;/li&gt;&#10;&lt;li&gt;「最初から」で適用済みシードの初期状態へ戻します。再生成時は植物と経過時間も初期化します&lt;/li&gt;&#10;&lt;li&gt;表示は通常の「植物」、保持量を色にする「エネルギー」、真上からの遮光を示す「日照」を選べます&lt;/li&gt;&#10;&lt;li&gt;新規発生率は、日向の地形直上にある空セルごとの毎秒の確率です。初期値は0.002%、範囲は0〜0.02%で、0では実行中の新規発生を止めます。初期配置と既存植物からの成長には影響しません。変更は次の更新から適用されます&lt;/li&gt;&#10;&lt;li&gt;寿命は0〜600秒で調整でき、0では寿命による枯死を無効にします。実行中の変更は次の更新から適用されます。エネルギー不足や接続切れによる枯死は有効です&lt;/li&gt;&#10;&lt;li&gt;時間倍率は1〜16倍です。表示される秒数はシミュレーション内の経過時間です&lt;/li&gt;&#10;&lt;li&gt;青緑が地形、緑が植物です。日照表示は黄色が受光、暗い青が遮光です&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;!-- demo --&gt;&#10;&lt;h2 id="gpuでの更新"&gt;GPUでの更新&lt;/h2&gt;&#10;&lt;p&gt;状態はGPUのStorage Bufferに保持します。CPUは操作入力、時間の管理、Dispatchと描画の指示を担当し、シミュレーション状態や描画件数を毎フレーム読み戻しません。パーティクル、掘削、堆積は一旦削除しています。&lt;/p&gt;&#10;&lt;h3 id="シードからの地形生成"&gt;シードからの地形生成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;integers.&lt;span style="color:#ff7b72"&gt;set&lt;/span&gt;([Number(viewControl.value),activeSeed,&lt;span style="color:#a5d6ff"&gt;0&lt;/span&gt;,&lt;span style="color:#a5d6ff"&gt;0&lt;/span&gt;],&lt;span style="color:#a5d6ff"&gt;24&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;シードはFloat32ではなくUniform Bufferの&lt;code&gt;u32&lt;/code&gt;領域へ書きます。大きな整数をFloat32へ変換して下位ビットが失われることを避け、uint32の全範囲を入力として扱います。植物の初期配置と新しい種の発生にも、同じ整数シードを使います。&lt;/p&gt;&#10;&lt;p&gt;地形は、シードで変わる3D Value Noiseを使う陰関数で生成します。低周波の地形に座標の歪みと高さ方向の凹凸を加えて、岩の張り出しを作ります。さらに位置・半径・曲がり方・高さがシードで変化する4本の通路をくり抜きます。通路と地表が交わる場所は開口やアーチになり、地表下を通る場所はトンネルになります。個別の地形座標やシードごとの特例は持ちません。&lt;/p&gt;&#10;&lt;p&gt;真の距離関数ではなく、内外を判定する密度表現です。生成結果をボクセルへ格納し、その後の描画・植物更新はボクセルを参照します。最下部2層は床として残し、生成形状の安定性や全ての通路の接続までは保証しません。ノイズのスケールや通路数などは、生成器の調整パラメータです。&lt;/p&gt;&#10;&lt;p&gt;地形の書き込みと植物の初期配置は別Dispatchにします。植物は確定した地形配列を読み、地形直上の空セルから初期の種を選びます。同じシード・同じ実装と実行環境では同じ初期状態を再現できます。GPUの浮動小数点演算を使うため、異なるGPU間で境界セルまで完全一致することは保証していません。&lt;/p&gt;&#10;&lt;h3 id="セルと空間の大きさ"&gt;セルと空間の大きさ&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-wgsl" data-lang="wgsl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;struct&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;Plant&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;energy:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;f32,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;age:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;f32,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;parent:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;u32,&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;birth:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;u32,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;parentBirth:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;u32,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;colony:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;u32,&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;upProbability:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;f32,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;generation:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;u32&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;植物の状態は1セル32バイトです。地形は別の整数配列に保持します。植物配列は2面で64 MiB、そのほか地形・日照・更新後エネルギー・描画セル一覧を各4 MiB確保し、主要な状態バッファは合計84 MiB（種の競合用4 MiBを含む）です。描画先とDepthは別途必要です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;const&lt;/span&gt; world&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;{x:&lt;span style="color:#ff7b72"&gt;128&lt;/span&gt;,y:&lt;span style="color:#ff7b72"&gt;64&lt;/span&gt;,z:&lt;span style="color:#ff7b72"&gt;128&lt;/span&gt;};&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;空間サイズの定義はTypeScriptのこの一か所です。Uniform Bufferで全シェーダーへ渡し、座標変換、Dispatch数、ボックス境界にも同じ値を使います。WGSLの共通宣言はこの実験内の&lt;code&gt;world.wgsl&lt;/code&gt;にまとめ、各シェーダーのコンパイル時に先頭へ連結します。&lt;/p&gt;&#10;&lt;h3 id="真上からの日照"&gt;真上からの日照&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-wgsl" data-lang="wgsl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sunlight[i]&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;select(&lt;span style="color:#a5d6ff"&gt;0u&lt;/span&gt;,&lt;span style="color:#a5d6ff"&gt;1u&lt;/span&gt;,open);&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;if&lt;/span&gt;(terrain[i]&lt;span style="color:#ff7b72;font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;0u&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;||&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;plants[i].energy&lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;0.0&lt;/span&gt;)&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt; &lt;/span&gt;open&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#79c0ff"&gt;false&lt;/span&gt;;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;XZ列ごとに1つのInvocationを割り当て、上から下へ走査します。地形または植物に遮られるまでは受光できます。植物自身を評価した後で遮光するため、一番上の植物は光を受け、その下は陰になります。斜めの太陽光、透過、散乱は扱いません。&lt;/p&gt;&#10;&lt;h3 id="エネルギーの獲得消費輸送"&gt;エネルギーの獲得・消費・輸送&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-wgsl" data-lang="wgsl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exchange&lt;span style="color:#ff7b72;font-weight:bold"&gt;+=&lt;/span&gt;(other.energy&lt;span style="color:#ff7b72;font-weight:bold"&gt;-&lt;/span&gt;plant.energy)&lt;span style="color:#ff7b72;font-weight:bold"&gt;*&lt;/span&gt;transportRate;&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6近傍の植物とのエネルギー差に比例して交換します。双方が同じ前ステップの状態から逆向きの流量を計算するため、輸送だけでエネルギーは増えません。群体が異なっていても、隣接していれば交換します。根や茎に相当する輸送路の専用モデルはまだありません。&lt;/p&gt;</description></item></channel></rss>