wgsl.runWGSL Öğren
Türkçe referans Öğren hub

2. Tip Sistemi

WGSL'in en kritik bölümü: type checking, plain types, memory views, texture/sampler ve type alias'lar.

---

§6 Types

Programlar değerler hesaplar. WGSL'de bir tip (type), bir değerler kümesidir ve her değer tam olarak bir tipe aittir. Bir değerin tipi, o değer üzerinde gerçekleştirilebilecek operasyonların sözdizimini ve semantiğini belirler.

Örneğin, matematiksel 1 sayısı WGSL'de şu farklı değerlere karşılık gelir:

DeğerTip
1i32-bit signed integer (i32)
1u32-bit unsigned integer (u32)
1.0f32-bit floating point (f32)
1.0h16-bit floating point (f16, enable f16 gerekir)
1AbstractInt
1.0AbstractFloat

WGSL bunları farklı değerler olarak ele alır çünkü makine temsilleri ve operasyonları farklıdır.

Bir tip ya predeclared (önceden bildirilmiş) ya da WGSL kaynağında bir declaration ile oluşturulur.

Bazı tipler template parameterization olarak ifade edilir. Bir type-generator, template list ile parametrelendirildiğinde bir tip gösteren predeclared nesnedir. Örneğin atomic<u32>, atomic type-generator'ını <u32> template list'i ile birleştirir.

Bazı WGSL tipleri yalnızca kaynak program analizi ve çalışma zamanı davranışının belirlenmesi için kullanılır; WGSL kaynak metninde görünmez.

Not: Reference type'lar WGSL modüllerinde yazılmaz. Bkz. §6.4.3 Reference and Pointer Types.

---

6.1 Type Checking

Bir WGSL değeri bir expression (ifade) değerlendirilerek hesaplanır. Expression, WGSL grammar kurallarından adı "expression" ile biten biridir. Bir expression E, kendisi içinde yer alan subexpression'lar içerebilir.

Bir expression değerlendirmesinin ürettiği değer şunlara bağlıdır:

  • Static context: İfadeyi çevreleyen kaynak metin.
  • Dynamic context: İfadeyi değerlendiren invocation'ın durumu ve çalıştırma bağlamı.

Belirli bir ifadenin değerlendirmesinden çıkabilecek değerler her zaman belirli bir WGSL tipine ait olup bu tip ifadenin static type'ıdır. Static type yalnızca static context'e bağlıdır.

Bir type assertion e : T, "*T*, WGSL ifadesi e'nin static type'ıdır" demektir. Bu bir runtime kontrolü değil, program metni hakkında bir olgudur.

Type checking, başarıyla parse edilmiş bir WGSL modülündeki her ifadeyi static type'ına eşleme ve her statement'ın tip gereksinimlerini doğrulama sürecidir. Başarısız olursa type error (bir tür shader-creation error) oluşur.

WGSL statically typed bir dildir: type checking yalnızca program kaynak metnini inceleyerek başarılı olur veya type error bulur.

6.1.1 Type Rule Tables

WGSL'in type rule'ları, ifadeler için type rule table'lara organize edilir (satır başına bir rule). Bir type rule iki parçadan oluşur:

  • Conclusion — İfade için type assertion (veya statement için birden fazla type assertion).
  • Preconditions — Subexpression'lar için type assertion'lar, statement'ın sözdizimsel formu ve diğer koşullar.

Parameterized type rule, type parameter içerir. Belirli tipler substitution ile atanarak fully elaborated rule elde edilir. Her olası substitution bir overload üretir.

Örneğin, mantıksal negasyon !e type rule'u:

PreconditionConclusion
e: T, T is bool or vecN<bool>!*e*: T

Bu parameterized rule'un 4 overload'u vardır (bool, vec2<bool>, vec3<bool>, vec4<bool>).

Bir syntactic phrase analiz edilirken üç durum olabilir: 1. Hiçbir type rule uygulanmaz → type error. 2. Tam bir fully elaborated rule uygulanır → static type belirlenir. 3. Birden fazla rule uygulanıroverload resolution (§6.1.3) ile çözülür.

6.1.2 Conversion Rank

Bir type assertion e: T precondition olarak kullanıldığında şu durumlarda karşılanır:

  • e zaten T tipindeyse, veya
  • e, S tipindeyse ve S'den T'ye feasible automatic conversion varsa.

ConversionRank(Src, Dest) fonksiyonu, bir tipten diğerine otomatik dönüşümün tercih edilirliğini ve uygulanabilirliğini ifade eder. Düşük rank daha tercih edilirdir.

Src → DestRankAçıklama
TT0Identity. Dönüşüm yok.
ref<AS,T,AM>T0Load Rule — bellekten değer yükleme (AM read veya read_write ise).
AbstractFloat → f321
AbstractFloat → f162
AbstractInt → i323Değer i32 aralığında değilse shader-creation error.
AbstractInt → u324Değer u32 aralığında değilse shader-creation error.
AbstractInt → AbstractFloat5
AbstractInt → f326AbstractInt → AbstractFloat → f32 zinciri.
AbstractInt → f167AbstractInt → AbstractFloat → f16 zinciri.
vecN<S>vecN<T>ConversionRank(S, T)Component type'tan miras alır.
matCxR<S>matCxR<T>ConversionRank(S, T)Component type'tan miras alır.
array<S,N>array<T,N>ConversionRank(S, T)Component type'tan miras alır (yalnızca fixed-size array).
Diğer STDiğer tipler arasında otomatik dönüşüm yoktur.

Concretization: T tipi S'nin concretization'ıdır eğer T concrete ise, reference type değilse, ConversionRank(S,T) sonlu ise ve başka hiçbir concrete non-reference T2 tipi için ConversionRank(S,T2) ≤ ConversionRank(S,T) değilse.

Not: f32'ye dönüşüm her zaman f16'ya tercih edilir. Otomatik dönüşüm yalnızca modülde enable f16 aktifse f16 üretir.

6.1.3 Overload Resolution

Birden fazla type rule bir syntactic phrase'e uygulandığında, overload resolution ile bağ çözülür:

1. Her overload candidate C için, her subexpression i konumundaki ConversionRank C.R(i) hesaplanır. 2. Subexpression'lardan biri abstract tipe resolve olurken diğeri const-expression değilse, o candidate elimine edilir. 3. C1, C2'ye preferred ise:

4. Tek bir preferred candidate varsa overload resolution başarılı olur; yoksa başarısız olur → type error.

  • Her i için C1.R(i) ≤ C2.R(i), ve
  • En az bir i için C1.R(i) < C2.R(i).

Örnekler:

wgslreference
// log2(32): AbstractInt 32 → AbstractFloat'a dönüştürülür, sonuç AbstractFloat.
let x = log2(32);

// 1 + 2.5: AbstractInt 1 → AbstractFloat 1.0'a dönüşüm (rank 5,0 → kazanır),
// sonuç AbstractFloat.
let y = 1 + 2.5;

// let x = 1 + 2.5: x abstract olamaz, f32 veya f16 kandidatları kalır,
// f32 tercih edilir. Sonuç: let x: f32 = 1.0f + 2.5f;
let z = 1 + 2.5;

// 1u + 2.5: u32'den float'a feasible conversion yok → shader-creation error.

---

6.2 Plain Types

Plain type, boolean, sayı, vektör, matris veya bu değerlerin bileşimlerinin makine temsili için kullanılan tiplerdir.

Plain type = scalar | atomic | composite type.

Not: WGSL'deki plain type'lar C++'daki POD tiplerine benzer, ancak atomic ve abstract numeric tipleri de içerir.

6.2.1 Abstract Numeric Types

Bu tipler WGSL kaynağında yazılamaz; yalnızca type checking tarafından kullanılır. Belirli ifadeler shader-creation time'da, GPU'nun doğrudan implemente ettiğinden daha geniş bir sayısal aralık ve hassasiyetle değerlendirilir.

TipTanım
AbstractInt64-bit two's complement formatında temsil edilebilen tamsayılar.
AbstractFloatIEEE-754 binary64 (double precision) formatında temsil edilebilen sonlu floating point sayılar.
  • Abstract numeric tipdeki bir expression değerlendirmesi overflow yapmamalı, sonsuz veya NaN değer üretmemelidir.
  • Abstract tip: abstract numeric tip içeren veya olan tip. Concrete tip: abstract olmayan tip.

Suffix'siz literal'lar abstract numeric tiplere karşılık gelir:

  • Suffix'siz integer literal (123) → AbstractInt
  • Suffix'siz float literal (1.5) → AbstractFloat
wgslreference
// Explicitly-typed
var u32_1 = 1u;     // u32
var i32_1 = 1i;     // i32
var f32_1 = 1f;     // f32

// Inferred — abstract → concrete
let some_i32 = 1;           // → i32 (en tercih edilen: rank 3)
var u32_from_type: u32 = 1; // → u32
var f32_promotion: f32 = 1; // → f32

// Invalid
var i32_demotion: i32 = 1.0; // AbstractFloat → i32 dönüşüm yok!

6.2.2 Boolean Type

bool tipi true ve false değerlerini içerir.

PreconditionConclusionDescription
true: boolTrue değeri
false: boolFalse değeri

6.2.3 Integer Types

TipGenişlikAçıklamaMinMax
i3232-bitSigned integer (two's complement)i32(-2147483648)2147483647i
u3232-bitUnsigned integer0u4294967295u

Concrete integer tiplerdeki overflow eden ifadeler, sonucu modulo 2^bitwidth üretir.

Not: AbstractInt de bir integer tipidir.

6.2.4 Floating Point Types

TipFormatAçıklama
f32IEEE-754 binary32 (single precision)Her zaman kullanılabilir.
f16IEEE-754 binary16 (half precision)enable f16; directive'i gerektirir, yoksa shader-creation error.

Extreme değerler (pozitif):

TipEn küçük subnormalEn küçük normalEn büyük finiteEn büyük 2 kuvveti
f320x1p-149f0x1p-126f0x1.fffffep+127f0x1p+127f
f160x1p-24h0x1p-14h0x1.ffcp+15h (65504.0h)0x1p+15h
Not: AbstractFloat da bir floating point tipidir.

6.2.5 Scalar Types

Scalar tipler: bool, AbstractInt, AbstractFloat, i32, u32, f32, f16.

Alt grupları:

  • Numeric scalar: AbstractInt, AbstractFloat, i32, u32, f32, f16
  • Integer scalar: AbstractInt, i32, u32

Scalar conversion, bir scalar tipteki değeri farklı bir scalar tipe eşler. Şu yollarla gerçekleşir:

  • Açık value constructor çağrısı.
  • Abstract numeric tipten başka bir tipe feasible automatic conversion yoluyla.

6.2.6 Vector Types

Vector, 2, 3 veya 4 scalar bileşenden oluşan gruplanmış bir dizidir.

wgslreference
vec2<f32>  // 2 bileşenli f32 vektörü
vec3<i32>  // 3 bileşenli i32 vektörü
TipAçıklama
vecN<T>N bileşenli T tipi vektör. N ∈ {2, 3, 4}, T scalar olmalıdır. T, vektörün component type'ıdır.

Kullanım alanları: yön + büyüklük, uzayda konum, renk temsili (RGBA).

Birçok vektör (ve matris) operasyonu component-wise çalışır:

wgslreference
let x: vec3<f32> = a + b; // a, b vec3<f32>
// x[0] = a[0] + b[0]
// x[1] = a[1] + b[1]
// x[2] = a[2] + b[2]

Predeclared vector alias'ları:

AliasOrijinal TipKısıtlama
vec2i / vec3i / vec4ivec2<i32> / vec3<i32> / vec4<i32>
vec2u / vec3u / vec4uvec2<u32> / vec3<u32> / vec4<u32>
vec2f / vec3f / vec4fvec2<f32> / vec3<f32> / vec4<f32>
vec2h / vec3h / vec4hvec2<f16> / vec3<f16> / vec4<f16>f16 extension gerekir

6.2.7 Matrix Types

Matrix, 2, 3 veya 4 floating point vektörden oluşan gruplanmış bir dizidir.

TipAçıklama
matCxR<T>C sütun, R satırlı matris. C, R ∈ {2, 3, 4}. T, f32, f16 veya AbstractFloat olmalıdır. C adet vecR<T> sütun vektörü olarak görülebilir.
wgslreference
mat2x3<f32> // 2 sütun, 3 satır f32 matrisi
            // Eşdeğer: 2 adet vec3<f32> sütun vektörü.

Temel kullanım: lineer dönüşüm. Çarpım operatörü (*) ile:

  • Scalar ile ölçekleme
  • Vektöre dönüşüm uygulama
  • Matris birleştirme

Predeclared matrix alias'ları:

f32 Alias'larıf16 Alias'ları (f16 ext. gerekir)
mat2x2f, mat2x3f, mat2x4fmat2x2h, mat2x3h, mat2x4h
mat3x2f, mat3x3f, mat3x4fmat3x2h, mat3x3h, mat3x4h
mat4x2f, mat4x3f, mat4x4fmat4x2h, mat4x3h, mat4x4h

6.2.8 Atomic Types

Atomic type, concrete integer scalar tipi kapsülleyerek eşzamanlı gözlemcilere belirli garantiler sağlar.

TipAçıklama
atomic<T>T u32 veya i32 olmalıdır.

Kurallar:

  • Bir expression atomic tipe evaluate olmamalıdır.
  • Atomic tipler yalnızca workgroup address space'deki değişkenlerde veya read_write erişim modlu storage buffer değişkenlerinde instantiate edilebilir.
  • workgroup address space → memory scope Workgroup.
  • storage address space → memory scope QueueFamily.
  • Geçerli operasyonlar yalnızca atomic builtin function'lardır.
  • Atomic modification: atomic nesnenin içeriğini ayarlayan herhangi bir operasyon. Yeni değer mevcut değerle aynı olsa bile modification sayılır.
  • Atomic modification'lar her nesne için mutually ordered'dır.

6.2.9 Array Types

Array, indeksli bir eleman değerleri dizisidir. İlk eleman index 0'dadır.

TipAçıklama
array<E, N>Fixed-size arrayN elemanlı, E tipli. N, element count'tur.
array<E>Runtime-sized array — eleman sayısı çalışma zamanında belirlenir. Yalnızca belirli bağlamlarda kullanılabilir.

**Fixed-size array N kısıtlamaları:**

  • N, override-expression olmalıdır.
  • Concrete integer scalar tipe evaluate etmelidir.
  • N ≤ 0 ise:
  • const-expression ise → shader-creation error
  • Değilse → pipeline-creation error

Runtime-sized array eleman sayısı, ilişkili storage buffer binding'in boyutuna göre belirlenir.

**Eleman tipi E kısıtlamaları:**

  • Plain, constructible veya fixed-footprint tipte olmalıdır.
  • Runtime-sized array, struct'ın son üyesinde veya doğrudan storage buffer variable türü olarak kullanılabilir.
wgslreference
array<f32, 4>     // 4 elemanlı f32 dizisi
array<vec3<f32>>  // runtime-sized vec3<f32> dizisi

6.2.10 Structure Types

Structure (struct), her biri adı ve tipine sahip bir veya daha fazla member'dan oluşan, isimlendirilen bir tipdir.

wgslreference
struct PointLight {
  position : vec3f,
  color    : vec3f,
}

struct LightStorage {
  pointCount : u32,
  point      : array<PointLight>,
}

Kurallar:

  • Her struct struct keyword'ü ile bilddirilir.
  • Bir WGSL modülünde aynı struct adı en fazla bir kez bildirilebilir.
  • İki farklı struct declaration'ı aynı yapıda member'lara sahip olsa bile farklı tiplerdir (nominal typing).
  • Üyeler bildirim sırasına göre indekslidir (ilk üye = index 0).
  • Member erişimi .member_name ile yapılır.
  • Struct'lar doğrudan veya dolaylı olarak kendi kendine referans veremez (öz-referanslı yapılar yasaktır).

6.2.11 Composite Types

Composite type, bileşenlerden oluşan tiplerdir:

  • Vector — component'ları scalar.
  • Matrix — component'ları vector (veya column olarak bakıldığında: scalar'lar).
  • Array — element'leri.
  • Structure — member'ları.

Her composite tip, bileşenlerine erişim ve doğrudan veya dolaylı olarak scalar tiplerine ulaşmayı sağlar.

Nesting depth kavramı: Scalar/atomic = 0; composite tipte 1 + max(bileşenlerin derinliği). Maximum nesting depth: 15.

6.2.12 Constructible Types

Constructible type, let, const veya value constructor ile değer oluşturulabilen tiplerdir:

  • bool
  • Integer scalar tipler: i32, u32
  • Floating point scalar tipler: f32, f16
  • Constructible component tipli vektörler
  • Constructible column tipli matrisler
  • Constructible eleman tipli fixed-size array'ler
  • Tüm üyeleri constructible olan struct'lar

Constructible olmayan tipler: atomic<T>, runtime-sized array, constructible olmayan üyeye sahip struct.

6.2.13 Fixed-Footprint Types

Fixed-footprint tip, boyutu yalnızca tipine göre belirlenen tipdir (runtime bilgisine bağlı değil):

  • Scalar tipler, vektörler, matrisler, atomic tipler
  • Fixed-size array (element count const-expression ise)
  • Tüm üyeleri fixed-footprint olan struct'lar

Creation-fixed footprint: element count override-expression veya const-expression ise. Override-sized array: element count const-expression olmayan override-expression ise.

---

6.3 Enumeration Types

Enumeration type, ayrık (discrete) değerler kümesidir. Enum'ın her bir değeri bir enumerant value'dur.

Bazı enum tipler predeclared olup WGSL kaynak metninde yazılamaz:

  • address_space — Adres alanı (function, private, workgroup, uniform, storage, handle)
  • access_mode — Erişim modu (read, write, read_write)
  • texel_format — Texel biçimi (rgba8unorm, rgba16float, r32float vb.)

6.3.1 Predeclared Enumerants

Address Space enumerant'ları:

EnumerantAçıklama
functionFonksiyon çağrısının ömrü boyunca var olan değişkenler
privateInvocation'a özel değişkenler
workgroupCompute shader workgroup'undaki paylaşılmış değişkenler
uniformUniform buffer değişkenleri (salt okunur)
storageStorage buffer değişkenleri
handleTexture ve sampler'lar (kaynağa doğrudan yazılamaz)

Access Mode enumerant'ları:

EnumerantAçıklama
readYalnızca okuma
writeYalnızca yazma
read_writeHem okuma hem yazma

Texel Format enumerant'ları:

KanalFormatlar
RGBA 8-bitrgba8unorm, rgba8snorm, rgba8uint, rgba8sint
RGBA 16-bitrgba16uint, rgba16sint, rgba16float
RGBA 32-bitrgba32uint, rgba32sint, rgba32float
RG 32-bitrg32uint, rg32sint, rg32float
R 32-bitr32uint, r32sint, r32float
BGRA 8-bitbgra8unorm

---

6.4 Memory Views

Bellek görünümü tipleri, bellekte saklanan değerlere erişim biçimlerini tanımlar. Bellek görünümü, saklama, paylaşma ve erişim mekanizmalarını kapsar.

6.4.1 Storable Types

Storable type, bellekte saklanabilen tiplerdir. Tüm plain tipler (atomic, constructible vb.) ve saklama desteği olan tipler storable'dır.

Storable tip: plain type veya texture/sampler tipi.

6.4.2 Host-shareable Types

Host-shareable type, GPU ile CPU arasında paylaşılabilen tiplerdir. uniform ve storage address space'lerdeki değişkenlerin tipleri host-shareable olmalıdır.

Host-shareable tipler:

  • Scalar tipler (abstract olmayan): i32, u32, f32, f16
  • Atomic tipler
  • Host-shareable component tipli vektörler
  • Host-shareable column tipli matrisler
  • Host-shareable eleman tipli fixed-size array'ler
  • Tüm üyeleri host-shareable olan struct'lar
Not: bool tipi host-shareable değildir.

Bellekteki yerleşim (layout), alignment ve size kurallarına tabidir. @align ve @size attribute'ları ile kontrol edilebilir.

6.4.3 Reference and Pointer Types

WGSL'de değişkenler bellekte yer kaplar. Belirli bir bellek konumuna erişmek için iki tip vardır:

TipAçıklama
ref<AS, T, AM>Reference type — kaynak metninde yazılamaz. Bir bellek konumuna doğrudan referans.
ptr<AS, T, AM>Pointer type — kaynak metninde yazılabilir. Bir bellek konumunun saklanabilir temsili.

Parametreler:

  • AS: address space (function, private, workgroup, uniform, storage)
  • T: stored type (saklanacak tip)
  • AM: access mode (read, write, read_write)

Reference tipler otomatik olarak oluşturulur: bir değişken adı kullanıldığında ortaya çıkan ifade bir reference'tır. Load Rule, readable reference'tan değer okumak için otomatik olarak uygulanır.

wgslreference
var x: f32 = 1.0;     // x'in tipi: ref<function, f32, read_write>
let value = x;         // Load Rule uygulanır → value: f32
let p = &x;            // p'nin tipi: ptr<function, f32, read_write>
let value2 = *p;       // Pointer dereference → Load Rule → f32

6.4.4 Valid and Invalid Memory References

Valid memory reference: referansın işaret ettiği bellek konumunun anlamlı değerler barındırması garanti edilen referans.

Invalid memory reference: geçersiz referanslara erişim WGSL tarafından tanımsız davranış değildir — bunun yerine güvenli varsayılan davranışlar uygulanır.

  • Array sınırı dışı erişim → sınır içine normalize edilir (clamp).
  • Geçersiz pointer → implementasyon tarafından iyi tanımlanmış bir sonuç üretir.

6.4.5 Originating Variable

Her reference veya pointer'ın bir originating variable'ı vardır — bu, referansın nihayetinde işaret ettiği kök değişkendir.

Kurallar:

  • Bir fonksiyona pointer parametresi geçirildiğinde, originating variable korunur.
  • İki pointer, aynı originating variable'a sahip olmalıdır — aksi durumda birlikte kullanılamazlar.

6.4.6 Out-of-Bounds Access

Dinamik olarak belirlenen bir indeks ile diziye erişildiğinde, indeks sınır dışındaysa davranış:

  • Okuma: [0, N-1] aralığına clamp edilir (N = eleman sayısı). Sonuç, dizinin geçerli bir elemanının değeridir.
  • Yazma: [0, N-1] aralığına clamp edilir. Geçerli bir elemana yazma gerçekleşir.
  • Bu, hafıza güvenliğini garanti eder ama mantıksal hatayı gizleyebilir.
wgslreference
var arr: array<f32, 4>;
let idx = 10u;
let val = arr[idx]; // idx clamp → arr[3]

6.4.7 Use Cases for References and Pointers

Reference kullanım alanları:

  • Değişkenin değerini okuma (Load Rule otomatik uygulanır).
  • Değişkene atama (sol tarafta kullanım).
  • Compound assignment (x += 1).
  • Atomic built-in fonksiyon çağrıları.

Pointer kullanım alanları:

  • Fonksiyonlara bellek konumu geçirme (pass-by-reference semantiği).
  • Referansı saklama ve sonra kullanma.
  • Struct veya array üyesine dolaylı erişim.
wgslreference
fn increment(p: ptr<function, i32>) {
  *p += 1;
}

fn main() {
  var counter: i32 = 0;
  increment(&counter);
  // counter artık 1
}

6.4.8 Forming Reference and Pointer Values

Reference ve pointer değerleri oluşturma yolları:

KaynakSonuç TipiAçıklama
Değişken adı vref<AS, T, AM>Değişkenin referansı
&e (address-of)ptr<AS, T, AM>Reference'tan pointer oluşturma
*p (dereference)ref<AS, T, AM>Pointer'dan reference oluşturma
e.memberref<AS, M, AM>Structure member erişimi
e[i]ref<AS, E, AM>Array veya vector element erişimi

Kısıtlamalar:

  • let ile bildirilen pointer'lar yalnızca function ve private address space'lere işaret edebilir.
  • Pointer'a pointer oluşturulamaz (çift indirection yok).
  • Pointer, global scope'ta let ile bildirilemez.

6.4.9 Comparison with References and Pointers in Other Languages

ÖzellikWGSLC / C++Rust
Pointer aritmetiği❌ Yok✅ Var❌ Yok (safe)
Null pointer❌ Yok✅ Var❌ (safe)
Dangling pointer❌ Sistem engeller⚠ Tanımsız davranış❌ Borrow checker engeller
Implicit load✅ Load Rule❌ Explicit dereference✅ Auto-deref
Tip/erişim kaynak metninde✅ address_space + access_mode✅ Lifetime + mutability

---

6.5 Texture and Sampler Types

Texture ve sampler tipleri, yaygın GPU rendering donanımını WGSL'de kullanıma açar. Her ikisi de opaque tiplerdir — yalnızca handle olarak kullanılır, iç yapılarına doğrudan erişilemez.

Texture, GPU belleğindeki çok boyutlu veri dizisidir. Sampler, texture'ın nasıl örnekleneceğini (sample) tanımlar: filtreleme, adres sarmalama vb.

Her ikisi de handle address space'te bulunur ve pipeline creation sırasında binding ile ilişkilendirilir.

6.5.1 Texel Formats

Texel format, bir texel'in (texture element) bellek düzenini tanımlar. Storage texture'lar belirli bir texel formatı belirtmelidir.

FormatBileşenlerKanal düzeniChannel format
rgba8unorm4R8 G8 B8 A8[0.0, 1.0] normalized
rgba8snorm4R8 G8 B8 A8[-1.0, 1.0] normalized
rgba8uint4R8 G8 B8 A8unsigned integer
rgba8sint4R8 G8 B8 A8signed integer
rgba16uint4R16 G16 B16 A16unsigned integer
rgba16sint4R16 G16 B16 A16signed integer
rgba16float4R16 G16 B16 A16float
r32uint1R32unsigned integer
r32sint1R32signed integer
r32float1R32float
rg32uint2R32 G32unsigned integer
rg32sint2R32 G32signed integer
rg32float2R32 G32float
rgba32uint4R32 G32 B32 A32unsigned integer
rgba32sint4R32 G32 B32 A32signed integer
rgba32float4R32 G32 B32 A32float
bgra8unorm4B8 G8 R8 A8[0.0, 1.0] normalized

Her texel formatına karşılık gelen bir channel format ve texel type vardır. Texel type, built-in fonksiyonlarda dönüş veya parametre tipi olarak kullanılır.

6.5.2 Sampled Texture Types

Sampled texture, shader'da örnekleme veya yükleme (load) ile okunur. Texel component tipi T, f32, i32 veya u32 olmalıdır.

TipAçıklama
texture_1d<T>1 boyutlu sampled texture
texture_2d<T>2 boyutlu sampled texture
texture_2d_array<T>2 boyutlu sampled texture dizisi
texture_3d<T>3 boyutlu sampled texture
texture_cube<T>Küp haritası sampled texture
texture_cube_array<T>Küp haritası sampled texture dizisi

6.5.3 Multisampled Texture Types

Multisampled texture, her texel'de birden fazla sample barındırır (anti-aliasing için).

TipAçıklama
texture_multisampled_2d<T>2 boyutlu multisampled texture, T: f32, i32 veya u32.

6.5.4 External Sampled Texture Types

TipAçıklama
texture_externalDış kaynaklı (video frame vb.) sampled texture. Örnekleme veya yükleme ile okunabilir.

6.5.5 Storage Texture Types

Storage texture'lar, texel formatı ve erişim modunu açıkça belirtir. Shader tarafından okunabilir veya yazılabilir.

TipAçıklama
texture_storage_1d<F, A>1 boyutlu storage texture
texture_storage_2d<F, A>2 boyutlu storage texture
texture_storage_2d_array<F, A>2 boyutlu storage texture dizisi
texture_storage_3d<F, A>3 boyutlu storage texture
  • F: texel format (rgba8unorm, r32float vb.)
  • A: access mode (read, write, read_write)

6.5.6 Depth Texture Types

Depth texture'lar derinlik bilgisi saklar. Component tipi f32'dir.

TipAçıklama
texture_depth_2d2 boyutlu depth texture
texture_depth_2d_array2 boyutlu depth texture dizisi
texture_depth_cubeKüp haritası depth texture
texture_depth_cube_arrayKüp haritası depth texture dizisi
texture_depth_multisampled_2d2 boyutlu multisampled depth texture

6.5.7 Sampler Type

Sampler, texture örneklemesinde filtreleme ve adres sarmalama gibi parametreleri tanımlar.

TipAçıklama
samplerÖrnekleme sampler'ı (texture filtreleme)
sampler_comparisonKarşılaştırma sampler'ı (derinlik karşılaştırması için)

---

6.6 AllTypes Type

AllTypes, tüm WGSL tiplerinin üst kümesidir. Bu bir kavramsal çerçevedir ve kaynak metninde yazılmaz. Type rule'larda, bir parametrenin herhangi bir tip olabileceğini belirtmek için kullanılır.

---

6.7 Type Aliases

Type alias, mevcut bir tipe yeni bir isim verir. Alias, orijinal tipin tam eşdeğeridir (nominal olarak farklı değildir).

wgslreference
alias float4 = vec4<f32>;
alias Arr = array<i32, 5>;

// Kullanım
var color: float4;
var data: Arr;
bnfreference
type_alias_decl :
  'alias' ident '=' type_specifier

Type alias'lar sadece modül scope'ta bildirilebilir. Bir alias, tanımlandıktan sonra görünür hale gelir. Döngüsel alias zinciri (A → B → A) yasaktır ve shader-creation error üretir.

---

6.8 Type Specifier Grammar

Tip belirtme (type specifier), bir tipi kaynak metninde ifade etmenin sözdizimsel yoludur.

bnfreference
type_specifier :
  | ident template_elaborated_ident

Bir type specifier, ya doğrudan bir tip adıdır ya da template list ile parametrelendirilmiş bir formda yazılır:

wgslreference
f32                  // Basit tip adı
vec3<f32>            // Template parametreli tip
array<vec2<f32>, 4>  // İç içe template parametreler

---

6.9 Predeclared Types and Type-Generators Summary

Tüm predeclared tiplerin ve type-generator'ların özet tablosu:

KategoriTipler / Generator'lar
Scalarbool, i32, u32, f32, f16
Vectorvec2<T>, vec3<T>, vec4<T> + alias'lar (vec2f, vec3u vb.)
Matrixmat2x2<T> ... mat4x4<T> + alias'lar (mat4x4f, mat3x3h vb.)
Arrayarray<E, N>, array<E>
Atomicatomic<T>
Pointerptr<AS, T, AM>
Texturetexture_1d<T>, texture_2d<T>, texture_3d<T>, texture_cube<T>, texture_2d_array<T>, texture_cube_array<T>, texture_multisampled_2d<T>, texture_external, texture_storage_*<F,A>, texture_depth_*
Samplersampler, sampler_comparison

---