Signatur
Beschreibung
copyTextureToBuffer() kopiert nicht sofort. Die Methode schreibt nur einen Kopierbefehl in den GPUCommandEncoder. Die GPU führt ihn erst aus, wenn du den Encoder mit finish() abschließt und den entstandenen GPUCommandBuffer mit device.queue.submit() übergibst. Rufe die Methode außerhalb eines Render- oder Compute-Passes auf, also vor beginRenderPass()/beginComputePass() oder nach pass.end().
Meistens liest du damit Texturdaten zurück, zum Beispiel für Screenshots, Pixel-Picking, automatische Tests oder Compute-Ergebnisse aus einer Storage-Textur. Das Ziel ist dabei ein Staging-Puffer mit GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ. Mit mapAsync(GPUMapMode.READ) machst du ihn danach für die CPU lesbar. Die Quelltextur braucht das Usage-Flag GPUTextureUsage.COPY_SRC.
Du kannst jeden rechteckigen bzw. quaderförmigen Teilbereich einer bestimmten Mip-Stufe und Array-Ebene kopieren:
source.originlegt den Startpunkt in der Textur fest (in Texeln, bei Array-Texturen istzdie erste Ebene).copySizelegt die Größe fest.offset,bytesPerRowundrowsPerImagelegen fest, wie die Daten im Puffer liegen.
Die häufigste Stolperfalle ist bytesPerRow. Der Wert muss ein Vielfaches von 256 sein. Bei „krummen“ Texturbreiten sind die Zeilen im Puffer deshalb am Ende aufgefüllt. Dieses Auffüllen musst du beim Auslesen wieder entfernen. Die Formel dafür lautet Math.ceil(breite * bytesProTexel / 256) * 256.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $source Pflicht | GPUTexelCopyTextureInfo (früher GPUImageCopyTexture) | Beschreibt die Quelle. Das Objekt hat diese Eigenschaften:
|
|
| $destination Pflicht | GPUTexelCopyBufferInfo (früher GPUImageCopyBuffer) | Beschreibt das Ziel. Das Objekt hat diese Eigenschaften:
|
|
| $copySize Pflicht | GPUExtent3D ({width, height, depthOrArrayLayers} | number[]) | Größe des kopierten Bereichs in Texeln. height und depthOrArrayLayers sind standardmäßig 1. Als Array schreibst du [width, height, depth]. |
Rückgabewert
finish() bzw. submit() (abfangbar mit device.pushErrorScope()).