Signatur
Beschreibung
GPUTextureView ist Teil der WebGPU API. Eine Texture View legt fest, wie und welcher Ausschnitt einer GPUTexture von der GPU gelesen oder beschrieben wird. Shader und Render Passes greifen nie direkt auf eine Textur zu, sondern immer über eine View.
Eine View erzeugt man mit GPUTexture.createView(descriptor). Über den optionalen Deskriptor kann man die Dimension (z. B. "2d", "2d-array", "cube"), das Format, den Aspekt (Farbe, Tiefe, Stencil) sowie einen Bereich von Mip-Stufen und Array-Ebenen auswählen. Ohne Deskriptor deckt die View die gesamte Textur ab.
Typische Einsatzgebiete:
- Als
viewincolorAttachmentsbzw.depthStencilAttachmenteines Render Pass (Render-Ziel). - Als
resourcein einemGPUBindGroup-Eintrag, um die Textur im Shader zu sampeln oder als Storage-Textur zu beschreiben. - Um eine einzelne Mip-Stufe oder eine Seite einer Cubemap gezielt zu adressieren, z. B. beim Erzeugen von Mipmaps.
Das Interface selbst besitzt nur die Eigenschaft label (ein frei wählbarer Name für Fehlermeldungen und Debugging-Werkzeuge). Es hat keinen öffentlichen Konstruktor.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $descriptor.label | string | "" | Name der View für Debugging und Fehlermeldungen; später über view.label les- und schreibbar. |
| $descriptor.format | GPUTextureFormat | Format der Textur | Format der View; muss dem Texturformat entsprechen oder in viewFormats der Textur aufgeführt sein (z. B. "rgba8unorm-srgb"). |
| $descriptor.dimension | "1d" | "2d" | "2d-array" | "cube" | "cube-array" | "3d" | abhängig von der Textur | Dimension, unter der die Textur betrachtet wird. |
| $descriptor.usage | number (GPUTextureUsageFlags) | 0 (= Usage der Textur) | Teilmenge der Usage-Flags der Textur, die für diese View gelten sollen (neuere Spezifikationsversion). |
| $descriptor.aspect | "all" | "depth-only" | "stencil-only" | "all" | Welcher Aspekt einer Tiefen-/Stencil-Textur sichtbar ist. |
| $descriptor.baseMipLevel | number | 0 | Erste zugängliche Mip-Stufe. |
| $descriptor.mipLevelCount | number | alle verbleibenden | Anzahl der Mip-Stufen ab baseMipLevel. |
| $descriptor.baseArrayLayer | number | 0 | Erste zugängliche Array-Ebene. |
| $descriptor.arrayLayerCount | number | alle verbleibenden | Anzahl der Array-Ebenen ab baseArrayLayer (für "cube" genau 6). |
Beispiele
Canvas-View als Render-Ziel verwenden
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const context = document.querySelector('canvas').getContext('webgpu');
context.configure({ device, format: navigator.gpu.getPreferredCanvasFormat() });
// Pro Frame eine neue View der aktuellen Canvas-Textur erzeugen
const view = context.getCurrentTexture().createView({ label: 'Canvas-View' });
const encoder = device.createCommandEncoder();
const pass = encoder.beginRenderPass({
colorAttachments: [{
view,
clearValue: { r: 0.1, g: 0.2, b: 0.3, a: 1 },
loadOp: 'clear',
storeOp: 'store'
}]
});
pass.end();
device.queue.submit([encoder.finish()]);
console.log(view.label);
Textur-View in einer Bind Group für den Shader
const texture = device.createTexture({
size: [256, 256],
format: 'rgba8unorm',
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
});
const sampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' });
const bindGroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0), // zuvor erstellte Render-Pipeline
entries: [
{ binding: 0, resource: sampler },
{ binding: 1, resource: texture.createView() }
]
});
Einzelne Mip-Stufe bzw. Cubemap-View erzeugen
const mipTexture = device.createTexture({
size: [512, 512],
mipLevelCount: 10,
format: 'rgba8unorm',
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
});
// Nur Mip-Stufe 3 (64×64) als Render-Ziel
const level3 = mipTexture.createView({ baseMipLevel: 3, mipLevelCount: 1, label: 'Mip 3' });
// 6 Array-Ebenen als Cubemap interpretieren
const cubeTexture = device.createTexture({
size: [256, 256, 6],
format: 'rgba8unorm',
usage: GPUTextureUsage.TEXTURE_BINDING
});
const cubeView = cubeTexture.createView({ dimension: 'cube' });
console.log(level3.label, cubeView instanceof GPUTextureView);
Nur den Tiefenaspekt einer Depth-Stencil-Textur
const depthTexture = device.createTexture({
size: [canvas.width, canvas.height],
format: 'depth24plus-stencil8',
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
});
// Für Render Pass: kompletter Aspekt
const depthAttachmentView = depthTexture.createView();
// Für Shader-Zugriff: nur Tiefe
const depthOnlyView = depthTexture.createView({ aspect: 'depth-only' });
// Wichtig · Fallstricke
- Canvas-Texturen:
context.getCurrentTexture()liefert jeden Frame eine neue Textur. Die View darf daher nicht zwischengespeichert werden, sondern muss pro Frame neu erzeugt werden – sonst gibt es Validierungsfehler. - Validierungsfehler (z. B. ungültiger Mip-Bereich,
"cube"ohne 6 Ebenen, nicht erlaubtes Format) werfen keine Ausnahme, sondern erzeugen eine ungültige View und einen Fehler auf dem Device. Mitdevice.pushErrorScope('validation')bzw. demuncapturederror-Event abfangen; ein aussagekräftigeslabelhilft enorm. - Ein Render-Attachment muss genau eine Mip-Stufe und (bei 2D) genau eine Array-Ebene abdecken.
- Eine View hält ihre Textur nicht am Leben: Nach
texture.destroy()ist auch jede View davon unbrauchbar. - Formatwechsel (z. B. auf
-srgb) nur, wenn das Zielformat beicreateTexture()inviewFormatsangegeben wurde. - Kompatibilität: WebGPU steht nur in sicheren Kontexten und noch nicht in allen Browsern/Plattformen zur Verfügung. Vorher mit
if (!navigator.gpu)prüfen und ggf. auf WebGL zurückfallen. Auch in Web Workers verfügbar.