WGSL'de klip mesafeleri
Kırpma mesafeleri, ilkellerin kırpma hacmini, köşe aşamasının çıkışında kullanıcı tanımlı yarı boşluklarla kısıtlamanıza olanak tanır. Kendi kırpma düzlemlerinizi tanımlamak, WebGPU sahnelerinizde nelerin görüneceği konusunda daha fazla kontrol sahibi olmanızı sağlar. Bu teknik, özellikle görselleştirme üzerinde hassas kontrol sahibi olmanın önemli olduğu CAD yazılımı gibi uygulamalarda yararlıdır.
"clip-distances"
özelliği bir GPUAdapter'da mevcut olduğunda, WGSL'de kırpma mesafesi desteği almak için bu özelliğe sahip bir GPUDevice isteyin ve WGSL kodunuzda enable clip_distances;
ile bu uzantıyı açıkça etkinleştirin. Etkinleştirildikten sonra, clip_distances
yerleşik dizisini köşe üstü gölgelendiricinizde kullanabilirsiniz. Bu dizi, kullanıcı tanımlı bir kırpma düzlemindeki mesafeleri içerir:
- 0 olan kırpma mesafesi, köşenin düzlemde olduğu anlamına gelir.
- Pozitif mesafe, köşenin klip yarı alanının (tutmak istediğiniz taraf) içinde olduğu anlamına gelir.
- Negatif mesafe, köşenin kırpma yarı uzayının (atlamak istediğiniz taraf) dışında olduğu anlamına gelir.
Aşağıdaki snippet'e, chromestatus girişine ve 358408571 numaralı soruna bakın.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
requiredFeatures: ["clip-distances"],
});
const vertexShaderModule = device.createShaderModule({ code: `
enable clip_distances;
struct VertexOut {
@builtin(clip_distances) my_clip_distances : array<f32, 1>,
@builtin(position) my_position : vec4f,
}
@vertex fn main() -> VertexOut {
var output : VertexOut;
output.my_clip_distances[0] = 1;
output.my_position = vec4f(0, 0, 0, 1);
return output;
}
`,
});
// Send the appropriate commands to the GPU...
GPUCanvasContext getConfiguration()
GPUCanvasContext configure()
bir yapılandırma sözlüğüyle çağrıldıktan sonra GPUCanvasContext getConfiguration()
yöntemi, tuval bağlamı yapılandırmasını kontrol etmenize olanak tanır. Bu grupta device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
ve alphaMode
üye yer alıyor. Bu, Parçacıklar (HDR) örneğinde gösterildiği gibi, tarayıcının HDR kanvası destekleyip desteklemediğini kontrol etme gibi görevler için yararlıdır. Aşağıdaki snippet'i, chromestatus girişini ve 370109829 numaralı sorunu inceleyin.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
// Configure the canvas for HDR.
context.configure({
device,
format: "rgba16float",
toneMapping: { mode: "extended" },
});
const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
// The browser supports HDR canvas.
// Warning! The user still needs a HDR display to enjoy HDR content.
}
Nokta ve çizgi primitiflerinde derinlik önyargısı olmamalıdır
Daha önce duyurulduğu gibi, WebGPU spesifikasyonu artık bir oluşturma ardışık düzeninin topolojisi çizgi veya nokta türü olduğunda depthBias
, depthBiasSlopeScale
ve depthBiasClamp
'i sıfır olmayan bir değere ayarlamayı doğrulama hatası olarak kabul ediyor. 352567424 numaralı soruna bakın.
Alt gruplar için dahil edici tarama yerleşik işlevleri
Alt grup denemesi kapsamında, 361330160 numaralı sürüme aşağıdaki alt grup yerleşik işlevleri eklendi:
subgroupInclusiveAdd(value)
: Alt gruptaki tüm etkin çağrılarınvalue
'lerinin kapsayıcı tarama toplamını döndürür.subgroupInclusiveMul(value)
: Alt gruptaki tüm etkin çağrılarınvalue
'lerinin kapsayıcı tarama çarpımını döndürür.
Çoklu çizim için deneysel dolaylı destek
Birden fazla çizim için dolaylı GPU özelliği, tek bir GPU komutuyla birden fazla çizim çağrısı göndermenize olanak tanır. Bu özellikle, partikül sistemleri, örnekleme ve büyük sahneler gibi çok sayıda nesnenin oluşturulması gereken durumlarda faydalıdır. drawIndirect()
ve drawIndexedIndirect()
GPURenderPassEncoder yöntemleri, bir GPU arabelleğinin belirli bir bölgesinden tek seferde yalnızca tek bir çizim çağrısı gönderebilir.
Bu deneysel özellik standartlaştırılana kadar Chrome'da kullanılabilmesi için chrome://flags/#enable-unsafe-webgpu
adresinde "Güvenli Olmayan WebGPU Desteği" işaretini etkinleştirin.
GPUAdapter'da bulunan "chromium-experimental-multi-draw-indirect"
standart dışı GPU özelliğiyle bu özelliğe sahip bir GPUDevice isteyin. Ardından, çizim çağrılarını depolamak için GPUBufferUsage.INDIRECT
kullanımıyla bir GPUBuffer oluşturun. Daha sonra, yeni multiDrawIndirect()
ve multiDrawIndexedIndirect()
GPURenderPassEncoder yöntemlerinde bir oluşturma geçişi içinde çizim çağrıları göndermek için kullanabilirsiniz. Aşağıdaki snippet'e ve 356461286 numaralı soruna bakın.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});
// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
3, 1, 0, 0, // First draw call
3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
size: drawData.byteLength,
usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);
// Create a render pipeline, a vertex buffer, and a render pass encoder...
// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();
Gölgelendirici modülü derleme seçeneği katı matematik
GPUShaderModuleDescriptor'a, gölgelendirici modülü derleme sırasında katı matematiği etkinleştirmenize veya devre dışı bırakmanıza olanak tanıyan bir doğru/yanlış strictMath
geliştirici seçeneği eklendi. Bu özellik, chrome://flags/#enable-webgpu-developer-features
adresindeki "WebGPU Geliştirici Özellikleri" işaretinin arkasında yer alır. Bu, özelliğin yalnızca geliştirme sırasında kullanılması amaçlandığı anlamına gelir. 42241455 numaralı soruna bakın.
Bu seçenek şu anda Metal ve Direct3D'de desteklenmektedir. Sıkı matematik devre dışı bırakıldığında derleyici, gölgelendiricilerinizi aşağıdaki şekilde optimize edebilir:
- NaN ve Infinity değerlerinin olasılığı yoksayılır.
- -0 değerinin +0 olarak değerlendirilmesi.
- Bölme işlemini, ters değerle çarpma işlemiyle değiştirme.
- İşlemleri ilişkilendirme ve dağıtma özelliklerine göre yeniden düzenleme.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
GPUAdapter requestAdapterInfo() yöntemini kaldırın
GPUAdapter info
özelliğini kullanarak GPUAdapterInfo'yu zaten senkronize olarak alabildiğiniz için GPUAdapter requestAdapterInfo()
asynkron yöntemi gereksizdir. Bu nedenle, standart olmayan GPUAdapter requestAdapterInfo()
yöntemi kaldırıldı. Kaldırma amacını inceleyin.
Şafak güncellemeleri
tint_benchmark
yürütülebilir dosyası, gölgelendiricilerin WGSL'den her arka uç diline çevrilmesinin maliyetini ölçer. Bu konu hakkında daha fazla bilgi edinmek için yeni dokümanlara göz atın.
Bu, önemli noktalardan yalnızca bazılarını kapsar. Kapsamlı commit listesine göz atın.
WebGPU'daki Yenilikler
WebGPU'daki Yenilikler serisinde ele alınan tüm konuların listesi.
Chrome 131
- WGSL'de mesafeleri kırpma
- GPUCanvasContext getConfiguration()
- Nokta ve çizgi primitiflerinde derinlik önyargısı olmamalıdır
- Alt gruplar için dahili kapsayıcı tarama işlevleri
- Çoklu çizim için deneysel destek
- Shader modülü derleme seçeneği katı matematik
- GPUAdapter requestAdapterInfo() yöntemini kaldırın
- Dawn güncellemeleri
Chrome 130
- Çift kaynak karıştırma
- Metal'de gölgelendirici derleme süresiyle ilgili iyileştirmeler
- GPUAdapter requestAdapterInfo() desteğinin sonlandırılması
- Dawn güncellemeleri
Chrome 129
Chrome 128
- Alt gruplarla deneme yapma
- Çizgiler ve noktalar için derinlik önyargısı ayarının desteği sonlandırıldı
- preventDefault ise yakalanmayan hata DevTools uyarısını gizleme
- WGSL, önce örneklemeyi enterpolasyona tabi tutar ve ardından
- Dawn güncellemeleri
Chrome 127
- Android'de OpenGL ES için deneysel destek
- GPUAdapter bilgi özelliği
- WebAssembly birlikte çalışabilirlik iyileştirmeleri
- Komut kodlayıcı hataları iyileştirildi
- Dawn güncellemeleri
Chrome 126
- maxTextureArrayLayers sınırını artırma
- Vulkan arka uç için arabellek yükleme optimizasyonu
- Gölgelendirici derleme süresiyle ilgili iyileştirmeler
- Gönderilen komut arabellekleri benzersiz olmalıdır
- Dawn güncellemeleri
Chrome 125
Chrome 124
- Salt okunur ve okuma/yazma depolama alanı dokuları
- Hizmet çalışanları ve paylaşılan çalışanlar desteği
- Yeni adaptör bilgileri özellikleri
- Hata düzeltmeleri
- Dawn güncellemeleri
Chrome 123
- WGSL'de DP4a yerleşik işlevleri desteği
- WGSL'de sınırsız işaretçi parametreleri
- WGSL'de bileşimlerin referansını kaldırmak için söz dizimi
- Şablon ve derinlik özellikleri için ayrı salt okunur durum
- Dawn güncellemeleri
Chrome 122
- Uyumluluk modu ile erişimi genişletin (geliştirme aşamasındaki özellik)
- maxVertexAttributes sınırını artırma
- Dawn güncellemeleri
Chrome 121
- Android'de WebGPU desteği
- Windows'ta gölgelendirici derleme için FXC yerine DXC kullanma
- İşleme ve oluşturma geçişlerinde zaman damgası sorguları
- Gölgelendirici modüllerinin varsayılan giriş noktaları
- GPUExternalTexture renk alanı olarak display-p3 desteği
- Bellek yığınları hakkında bilgi
- Dawn güncellemeleri
Chrome 120
- WGSL'de 16 bitlik kayan nokta değerleri için destek
- Sınırları zorlayın
- Derinlik gölgesi durumundaki değişiklikler
- Adaptör bilgileri güncellemeleri
- Zaman damgası sorgularının kesirli sayılara dönüştürülmesi
- Bahar temizliği özellikleri
Chrome 119
- Filtrelenebilir 32 bit kayan noktalı dokular
- unorm10-10-10-2 köşe noktası biçimi
- rgb10a2uint doku biçimi
- Dawn güncellemeleri
Chrome 118
copyExternalImageToTexture()
'te HTMLImageElement ve ImageData desteği- Okuma/yazma ve salt okuma depolama dokusu için deneysel destek
- Dawn güncellemeleri
Chrome 117
- Köşe noktası arabelleğinin ayarını kaldırma
- Bağlama grubunu kaldırma
- Cihaz kaybolduğunda, eşzamansız ardışık düzen oluşturma işlemlerinden kaynaklanan hataları yoksayma
- SPIR-V gölgelendirici modülü oluşturma güncellemeleri
- Geliştirici deneyimini iyileştirme
- Otomatik olarak oluşturulan düzenle ardışık düzenleri önbelleğe alma
- Dawn güncellemeleri
Chrome 116
- WebCodecs entegrasyonu
- Kayıp cihaz, GPUAdapter
requestDevice()
tarafından döndürüldü importExternalTexture()
çağrılırsa video oynatmanın sorunsuz olmasını sağlama- Spesifikasyona uygunluk
- Geliştirici deneyimini iyileştirme
- Dawn güncellemeleri
Chrome 115
- Desteklenen WGSL dil uzantıları
- Direct3D 11 için deneysel destek
- AC güç kaynağında varsayılan olarak ayrı GPU'yu etkinleştirme
- Geliştirici deneyimini iyileştirme
- Dawn güncellemeleri
Chrome 114
- JavaScript'i optimize etme
- Yapılandırılmamış kanvasta getCurrentTexture() InvalidStateError hatası veriyor
- WGSL ile ilgili güncellemeler
- Dawn güncellemeleri
Chrome 113
importExternalTexture()
dosyasında WebCodecs VideoFrame kaynağını kullanma