three.js dev template - module

HTML

<script type="importmap">
	{
		"imports": {
			"three": "https://unpkg.com/three@0.173/build/three.module.js",
      "three/webgpu": "https://unpkg.com/three@0.173/build/three.webgpu.js",
      "three/tsl": "https://unpkg.com/three@0.173/build/three.tsl.js",
      "three/addons/": "https://unpkg.com/three@0.173/examples/jsm/"
		}
	}
</script>
    <canvas id="canvas_1" style="
          pointer-events: auto;
          touch-action: none;
        "></canvas>

CSS

body {
	margin: 0px;
  background-color: blue;
  overflow:hidden;
}

JavaScript

import * as THREE from "three";
import Stats from "three/addons/libs/stats.module.js";
import { GUI } from "three/addons/libs/lil-gui.module.min.js";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
import { RGBELoader } from "three/addons/loaders/RGBELoader.js";

//解决宽高问题
const common = `
uniform vec2 test;
const vec2 pool2 = vec2( 6, 6); 

const vec3 pool3 = vec3( floor( 512.0 / pool2), pool2.x * pool2.y); 


// 将三维坐标转换为二维坐标
vec2 dim2from3( vec3 q){
    float x, y;
    vec3 p;
    // 确保坐标在有效范围内
    p = clamp( q, vec3( 0), pool3);
    // 计算y坐标
    y = floor( p.z / pool2.x);
    // 计算x坐标
    x = floor( p.z) - y * pool2.x;
    // 返回二维坐标
    return vec2( x, y) * vec2( pool3.xy) + p.xy;
}

// 将二维坐标转换为三维坐标
vec3 dim3from2( vec2 w){
    return vec3(
        // 计算x、y坐标
        w - pool3.xy * floor( w / pool3.xy),
        // 计算z坐标
        floor( w.x / pool3.x) + pool2.x * floor( w.y / pool3.y)
    );
}

// 定义粒子结构体
struct Particle{
    // 粒子的质量
    uint m;
    // 粒子的位置
    vec3 pos;
    // 粒子的速度
    vec3 vel;
    // 粒子受到的力
    vec3 force;
    // 粒子的密度
    float density;
};


// 将三维向量打包为一个无符号整数
// 5位用于共享指数,9位用于每个分量
uint pack_vec3( vec3 v){
    // 找到向量分量的最大值
    float maxv = max( abs( v.x), max( abs( v.y), abs( v.z)));
    // 计算指数并限制在-15到15之间
    int exp = clamp( int( ceil( log2( maxv))), -15, 15);
    // 计算缩放因子
    float scale = exp2( -float( exp));
    // 将向量分量缩放并转换为无符号整数
    uvec3 sv = uvec3( round( clamp( v * scale, -1.0, 1.0) * 255.0) + 255.0);
    // 打包指数和向量分量
    return uint( exp + 15) | ( sv.x << 5) | ( sv.y << 14) | ( sv.z << 23);
}

// 将打包的无符号整数解包为三维向量
vec3 unpack_vec3( uint u){
    return ( vec3(
        // 提取x分量
        ( u >> 5) & 0x1ffu,
        // 提取y分量
        ( u >> 14) & 0x1ffu,
        // 提取z分量
        ( u >> 23) & 0x1ffu
    ) - 255.0) / 255.0 * exp2( float( u & 0x1fu) - 15.0);
}


//...