Co nowego w WebGPU (Chrome 119)

François Beaufort
François Beaufort

Filtrowalne 32-bitowe tekstury zmiennoprzecinkowe

32-bitowe tekstury zmiennoprzecinkowe służą do przechowywania danych o wysokiej dokładności, takich jak obrazy HDR czy mapy głębi. Są szczególnie ważne w przypadku układów GPU używanych w grach wysokiej klasy i aplikacjach profesjonalnych.

Obsługa filtrowalnych 32-bitowych tekstur zmiennoprzecinkowych opisuje możliwość filtrowania 32-bitowych tekstur zmiennoprzecinkowych przez GPU. Oznacza to, że GPU może wygładzać krawędzie tekstur zmiennoprzecinkowych, przez co są one mniej postrzępione. Przypomina wartość „OES_texture_float_linear” w WebGL.

Nie wszystkie GPU obsługują filtrowalne 32-bitowe tekstury zmiennoprzecinkowe. Gdy funkcja "float32-filterable" jest dostępna w GPUAdapter, możesz teraz zażądać GPUDevice z tą funkcją i filtrować tekstury za pomocą wartości „r32float”, „rg32float” i „rgba32float” formatów reklam. Zobacz ten przykład i problem świt:1664.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-filterable")) {
  throw new Error("Filterable 32-bit float textures support is not available");
}
// Explicitly request filterable 32-bit float textures support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-filterable"],
});

// Create a sampler with linear filtering.
const sampler = device.createSampler({
  magFilter: "linear",
});

// Create a texture with rgba32float format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgba32float",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with sampler and texture and
// send the appropriate commands to the GPU....

unorm10-10-10-2 wierzchołek

Nowy format wierzchołków o nazwie „unorm10-10-10-2” Inaczej „rgb10a2” dodaliśmy do specyfikacji WebGPU. Składa się z jednej spakowanej 32-bitowej wartości z 4 znormalizowanymi niepodpisanymi wartościami całkowitymi rozłożonymi na 10 bitów, 10 bitów, 10 bitów i 2 bity. Zobacz ten przykład i problem świt:2044.

// Define the layout of vertex attribute data with unorm10-10-10-2 format.
const buffers = [
  {
    arrayStride: 0,
    attributes: [
      { format: "unorm10-10-10-2", offset: 0, shaderLocation: 0 },
    ],
  },
];

// Describe the vertex shader entry point and its input buffer layouts.
const vertex = {
  module: myVertexShaderModule,
  entryPoint: "main",
  buffers,
};

// Pass vertex to device.createRenderPipeline() and
// use vec4<f32> type in WGSL shader code to manipulate data.

format tekstury rgb10a2uint

Nowy format tekstury o nazwie „rgb10a2uint”. dodaliśmy do specyfikacji WebGPU. Składa się z 32-bitowego spakowanego formatu piksela, który składa się z 4 niepowiązanych liczb całkowitych: 10-bitowego czerwonego, 10-bitowego zielonego, 10-bitowego niebieskiego i 2-bitowego alfa. Zobacz ten przykład i problem świt:1936.

// Create a texture with rgb10a2uint format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgb10a2uint",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with texture and
// send the appropriate commands to the GPU....

Aktualizacje o świcie

Zapytania dotyczące sygnatury czasowej pozwalają aplikacjom WebGPU dokładnie mierzyć (do nanosekundy) czas wykonywania poleceń GPU. Kształt interfejsu API umożliwiający rejestrowanie zapytań dotyczących sygnatur czasowych na początku i na końcu kart został zaktualizowany, aby był zgodny ze specyfikacją WebGPU. Zobacz ten przykład i problem dawn:1800.

// Create a timestamp query set that will store the timestamp values.
wgpu::QuerySetDescriptor querySetDescriptor = {
    .count = 2,
    .type = wgpu::QueryType::Timestamp};
wgpu::QuerySet querySet = device.CreateQuerySet(&querySetDescriptor);

wgpu::RenderPassTimestampWrites timestampWrites = {
    .querySet = querySet,
    .beginningOfPassWriteIndex = 0,
    .endOfPassWriteIndex = 1};
wgpu::ComputePassDescriptor pass{.timestampWrites = &timestampWrites};

// Write the queue timestamp into beginningOfPassWriteIndex and
// endOfPassWriteIndex of myQuerySet respectively before and after the pass
// commands execute.
myEncoder.BeginComputePass(&pass);

To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.

Co nowego w WebGPU

Lista wszystkiego, co zostało omówione w serii Co nowego w WebGPU.

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113