经纬志
首页 / luma.gl / 使用示例

纹理贴图

像素由 JS 生成,写进一张 64×64 的纹理,再作为 sampler2D 绑定给模型。 UV 取 0–2,寻址模式决定接缝处是平铺还是拉伸。

luma.gl 9.4 · 更新 2026-10-28
源码与运行效果
运行效果

说明

整个流程分三步: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 的纯色纹理验证绑定,再换成真实数据。