Start · Sprachen · JavaScript · Referenz · GPUTexture.width

GPUTexture.width

Eigenschaft

Die schreibgeschützte Eigenschaft <code>width</code> gibt die Breite einer <code>GPUTexture</code> in Texeln zurück, wie sie beim Erzeugen festgelegt wurde.

seit JavaScript WebGPU – Chrome/Edge 113+, Safari 26+, Firefox 141 Kategorie: webapi

Signatur

GPUTexture.width

Beschreibung

Die Eigenschaft GPUTexture.width liefert die Breite der Textur in Texeln. Der Wert entspricht der ersten Komponente von size aus dem Deskriptor, der an GPUDevice.createTexture() übergeben wurde. Bei Texturen aus GPUCanvasContext.getCurrentTexture() entspricht er der Breite des Canvas-Zeichenpuffers (canvas.width) zum Zeitpunkt des Abrufs.

Brauchbar ist die Eigenschaft vor allem dann, wenn Code eine Textur übernimmt, deren Deskriptor er nicht kennt. Typische Fälle: Viewport- oder Scissor-Rechtecke setzen, Tiefenpuffer mit passender Größe anlegen, Compute-Dispatches berechnen (Math.ceil(texture.width / workgroupSize)) oder bei copyTextureToBuffer() das bytesPerRow bestimmen.

Der Wert ist unveränderlich. WebGPU-Texturen lassen sich nicht in der Größe ändern. Wenn du eine andere Größe brauchst, musst du eine neue Textur erzeugen und die alte mit destroy() freigeben. Beachte, dass width immer die Breite der Mip-Stufe 0 angibt. Die Breite der Stufe n ist Math.max(1, texture.width >> n).

Rückgabewert

Typ
number
Beschreibung
Eine positive ganze Zahl (GPUIntegerCoordinateOut): die Breite der Textur in Texeln, bezogen auf die Mip-Stufe 0.

Beispiele

Breite einer neu erzeugten Textur auslesen

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const texture = device.createTexture({
  size: [640, 480],
  format: 'rgba8unorm',
  usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
});

console.log(texture.width, texture.height);
640 480

Passenden Tiefenpuffer zur Canvas-Textur anlegen

const canvas = document.querySelector('canvas');
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const context = canvas.getContext('webgpu');
context.configure({ device, format: navigator.gpu.getPreferredCanvasFormat() });

let depthTexture = null;

const getDepthTexture = (colorTexture) => {
  // Nur neu anlegen, wenn sich die Größe geändert hat
  if (!depthTexture ||
      depthTexture.width !== colorTexture.width ||
      depthTexture.height !== colorTexture.height) {
    depthTexture?.destroy();
    depthTexture = device.createTexture({
      size: [colorTexture.width, colorTexture.height],
      format: 'depth24plus',
      usage: GPUTextureUsage.RENDER_ATTACHMENT,
    });
  }
  return depthTexture;
};

const colorTexture = context.getCurrentTexture();
console.log('Tiefenpuffer-Breite:', getDepthTexture(colorTexture).width);
Tiefenpuffer-Breite: 300

Compute-Dispatch und Mip-Breiten berechnen

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const texture = device.createTexture({
  size: [1000, 600],
  mipLevelCount: 4,
  format: 'rgba8unorm',
  usage: GPUTextureUsage.STORAGE_BINDING,
});

const WORKGROUP = 8;
const groupsX = Math.ceil(texture.width / WORKGROUP);
console.log('Workgroups X:', groupsX);

for (let level = 0; level < texture.mipLevelCount; level++) {
  console.log(`Mip ${level}: ${Math.max(1, texture.width >> level)} px`);
}
Workgroups X: 125 Mip 0: 1000 px Mip 1: 500 px Mip 2: 250 px Mip 3: 125 px

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie texture.width = 800 wird stillschweigend ignoriert und wirft nur im strikten Modus einen TypeError. Um die Größe zu ändern, erzeugst du eine neue Textur.
  • Nur Mip-Stufe 0: Für höhere Mip-Stufen musst du die Breite selbst berechnen (Math.max(1, width >> level)).
  • Canvas-Texturen: getCurrentTexture() liefert pro Frame eine neue Textur. Deren Breite folgt canvas.width, nicht der CSS-Größe. Ob sich die Größe geändert hat, prüfst du deshalb jeden Frame neu.
  • Grenzen: Die maximale Breite hängt von device.limits.maxTextureDimension2D ab (mindestens 8192) bzw. von maxTextureDimension1D/3D.
  • Kompatibilität: WebGPU gibt es nur in sicheren Kontexten und noch nicht in allen Browsern bzw. auf allen Plattformen. Prüfe vorher mit if (!navigator.gpu), ob es verfügbar ist.