纹理贴图
像素由 JS 生成,写进一张 64×64 的纹理,再作为 sampler2D 绑定给模型。
UV 取 0–2,寻址模式决定接缝处是平铺还是拉伸。
说明
整个流程分三步:createTexture 分配存储,writeData 上传像素,
bindings 把纹理挂到着色器的同名 uniform 上。
采样器的纹理单元编号由 luma.gl 分配,着色器里不需要写 uniform1i。
「换图案」重新生成像素后再写一次,纹理对象不变; 「切换寻址模式」只替换纹理上的采样器,同样不重建模型。
| 项目 | 取值 | 说明 |
|---|---|---|
| 纹理尺寸 | 64 × 64 | 创建后不可改 |
| 像素格式 | rgba8unorm | 每像素四字节,可直接用 Uint8Array 填 |
| 用途 | SAMPLE | COPY_DST | 可采样、可写入 |
| 过滤 | linear | 放大缩小都插值 |
| UV 范围 | 0 – 2 | 超出 1 的部分由寻址模式处理 |
| 绑定名 | uTexture | 与 GLSL 的 uniform sampler2D 同名 |
采样器挂在纹理上
const tex = device.createTexture({
width: 64,
height: 64,
format: 'rgba8unorm',
usage: Texture.SAMPLE | Texture.COPY_DST,
sampler: {
minFilter: 'linear',
magFilter: 'linear',
mipmapFilter: 'none',
addressModeU: 'repeat',
addressModeV: 'repeat'
}
});
tex.writeData(pixels);
采样状态默认跟着纹理走。要换模式时调用 tex.setSampler({...}),
传进去的是完整参数,省略的字段回到默认的 nearest 与 clamp-to-edge。
UV 超出 0–1 的三种结果
| 寻址模式 | 表现 |
|---|---|
repeat | 平铺,2 的 UV 范围内图案重复两次 |
clamp-to-edge | 超出部分取边缘像素,形成拉长的色带 |
mirror-repeat | 平铺且每次翻转,接缝处图案镜像 |
上传图像与上传像素
writeData 面向原始字节;上传图片、视频帧或 DOM 元素时用
copyExternalImage({ image })。两者都写进同一张纹理,
区别只在数据来源,采样端完全一样。
GIS 里的对应场景
瓦片贴图、坡度晕渲、热力面都可以落在这一步:CPU 侧准备好像素或图片, 上传后由着色器按 UV 采样。大范围场景要配合 mipmap 与各向异性过滤, 否则斜视角度下的远处纹理会闪烁。
纹理不完整时画面是黑的,不是报错。
宽高对不上数据长度、缺少 COPY_DST 用途、绑定名与 uniform 不一致,
都会让采样返回零值。先用 1×1 的纯色纹理验证绑定,再换成真实数据。