Konversi tipe data

Bagian berikut menjelaskan cara Direct3D menangani konversi antar jenis data.

Terminologi Tipe Data

Kumpulan istilah berikut kemudian digunakan untuk mencirikan berbagai konversi format.

Term Definisi
SNORM Bilangan bulat normal yang ditandatangani, yang berarti bahwa untuk angka pelengkap n-bit 2, nilai maksimum berarti 1,0f (misalnya, nilai 5-bit 01111 memetakan ke 1,0f), dan nilai minimum berarti -1,0f (misalnya, nilai 5-bit 10000 peta ke -1,0f). Selain itu, angka minimum kedua memetakan ke -1,0f (misalnya, nilai 5-bit 10001 memetakan ke -1,0f). Dengan demikian ada dua representasi bilangan bulat untuk -1,0f. Ada satu representasi untuk 0,0f, dan satu representasi untuk 1,0f. Ini menghasilkan satu set representasi bilangan bulat untuk nilai floating point yang diukur secara merata dalam rentang (-1,0f... 0,0f), dan juga sekumpulan representasi pelengkap untuk angka dalam rentang (0,0f... 1.0f)
UNORM Bilangan bulat yang dinormalisasi yang tidak ditandatangani, yang berarti bahwa untuk angka n-bit, semua 0 berarti 0,0f, dan semua 1 berarti 1,0f. Urutan nilai titik pecahan yang di-spasi merata dari 0,0f hingga 1,0f diwakili. misalnya, UNORM 2-bit mewakili 0,0f, 1/3, 2/3, dan 1,0f.
SINT Bilangan bulat yang ditandatangani. 2 melengkapi bilangan bulat. misalnya, SINT 3-bit mewakili nilai integral -4, -3, -2, -1, 0, 1, 2, 3.
UINT Bilangan bulat yang tidak ditandatangani. misalnya, UINT 3-bit mewakili nilai integral 0, 1, 2, 3, 4, 5, 6, 7.
FLOAT Nilai floating-point dalam salah satu representasi yang ditentukan oleh Direct3D.
SRGB Mirip dengan UNORM, dalam hal itu untuk angka n-bit, semua 0 berarti 0,0f dan semua 1 berarti 1,0f. Namun tidak seperti UNORM, dengan SRGB urutan pengodean bilangan bulat yang tidak ditandatangani antara semua 0 hingga 1 mewakili perkembangan nonlinear dalam interpretasi titik float angka, antara 0,0f hingga 1,0f. Kira-kira, jika perkembangan nonlinear ini, SRGB, ditampilkan sebagai urutan warna, itu akan muncul sebagai lonjakan linier tingkat luminositas ke pengamat "rata-rata", di bawah kondisi tampilan "rata-rata", pada tampilan "rata-rata". Untuk detail lengkapnya, lihat standar warna SRGB, IEC 61996-2-1, di IEC (International Electrotechnical Commission).

 

Istilah di atas sering digunakan sebagai "Pengubah Nama Format", di mana mereka menjelaskan bagaimana data ditata dalam memori dan konversi apa yang harus dilakukan di jalur transportasi (berpotensi termasuk pemfilteran) dari memori ke atau dari unit Alur seperti Shader.

Konversi Titik Mengambang

Setiap kali konversi titik mengambang antara representasi yang berbeda terjadi, termasuk ke atau dari representasi titik non-floating, aturan berikut berlaku.

Berkonversi dari representasi rentang yang lebih tinggi ke representasi rentang yang lebih rendah

  • Round-to-zero digunakan selama konversi ke format float lain. Jika target adalah format bilangan bulat atau titik tetap, round-to-nearest-even digunakan, kecuali konversi secara eksplisit didokumenkan sebagai menggunakan perilaku pembulatan lain, seperti round-to-nearest untuk FLOAT ke SNORM, FLOAT ke UNORM atau FLOAT ke SRGB. Pengecualian lainnya adalah instruksi ftoi dan ftou shader, yang menggunakan round-to-zero. Akhirnya, konversi float-to-fixed yang digunakan oleh sampler tekstur dan rasterizer memiliki toleransi tertentu yang diukur dalam Unit-Last-Place dari ideal yang sangat tepat.
  • Untuk nilai sumber yang lebih besar dari rentang dinamis format target rentang bawah (misalnya, nilai float 32-bit besar ditulis ke dalam RenderTarget float 16-bit), hasil nilai maksimum yang dapat diwakili (ditandatangani dengan tepat), TIDAK termasuk tak terbatas yang ditandatangani (karena putaran ke nol yang dijelaskan di atas).
  • NaN dalam format rentang yang lebih tinggi akan dikonversi ke representasi NaN dalam format rentang bawah jika representasi NaN ada dalam format rentang bawah. Jika format yang lebih rendah tidak memiliki representasi NaN, hasilnya adalah 0.
  • INF dalam format rentang yang lebih tinggi akan dikonversi ke INF dalam format rentang bawah jika tersedia. Jika format yang lebih rendah tidak memiliki representasi INF, format tersebut akan dikonversi ke nilai maksimum yang dapat diwakili. Tanda akan dipertahankan jika tersedia dalam format target.
  • Denorm dalam format rentang yang lebih tinggi akan dikonversi ke representasi Denorm dalam format rentang bawah jika tersedia dalam format rentang bawah dan konversi dimungkinkan, jika tidak, hasilnya adalah 0. Bit tanda akan dipertahankan jika tersedia dalam format target.

Mengonversi dari representasi rentang bawah ke representasi rentang yang lebih tinggi

  • NaN dalam format rentang bawah akan dikonversi ke representasi NaN dalam format rentang yang lebih tinggi jika tersedia dalam format rentang yang lebih tinggi. Jika format rentang yang lebih tinggi tidak memiliki representasi NaN, format tersebut akan dikonversi ke 0.
  • INF dalam format rentang bawah akan dikonversi ke representasi INF dalam format rentang yang lebih tinggi jika tersedia dalam format rentang yang lebih tinggi. Jika format yang lebih tinggi tidak memiliki representasi INF, format tersebut akan dikonversi ke nilai maksimum yang dapat diwakili (MAX_FLOAT dalam format tersebut). Tanda akan dipertahankan jika tersedia dalam format target.
  • Denorm dalam format rentang bawah akan dikonversi ke representasi yang dinormalisasi dalam format rentang yang lebih tinggi jika memungkinkan, atau ke representasi Denorm dalam format rentang yang lebih tinggi jika representasi Denorm ada. Gagal, jika format rentang yang lebih tinggi tidak memiliki representasi Denorm, format tersebut akan dikonversi ke 0. Tanda akan dipertahankan jika tersedia dalam format target. Perhatikan bahwa angka float 32-bit dihitung sebagai format tanpa representasi Denorm (karena Denorms dalam operasi pada flush float 32-bit untuk menandatangani 0 yang dipertahankan).

Konversi Bilangan Bulat

Tabel berikut menjelaskan konversi dari berbagai representasi yang dijelaskan di atas ke representasi lain. Hanya konversi yang benar-benar terjadi di Direct3D yang ditampilkan.

Dengan bilangan bulat, kecuali ditentukan lain, semua konversi ke/dari representasi bilangan bulat ke representasi float yang dijelaskan di bawah ini akan dilakukan dengan tepat.

Tipe Data Sumber Tipe Data Tujuan Aturan Konversi
SNORM FLOAT

Mengingat nilai bilangan bulat n-bit yang mewakili rentang yang ditandatangani [-1,0f hingga 1,0f], konversi ke floating-point adalah sebagai berikut.

  • Nilai paling negatif dipetakan ke -1,0f. misalnya, nilai 5-bit 10000 peta ke -1,0f.
  • Setiap nilai lain dikonversi ke float (sebut saja c), lalu hasil = c * (1,0f / (2⁽ⁿ⁻¹⁾-1)). Misalnya nilai 5-bit 10001 dikonversi ke -15,0f, lalu dibagi 15,0f, menghasilkan -1,0f.
FLOAT SNORM

Mengingat angka floating-point, konversi ke nilai bilangan bulat n-bit yang mewakili rentang yang ditandatangani [-1,0f ke 1,0f] adalah sebagai berikut.

  • Biarkan c mewakili nilai awal.
  • Jika c adalah NaN, hasilnya adalah 0.
  • Jika c > 1.0f, termasuk INF, itu dijepit ke 1.0f.
  • Jika c < -1.0f, termasuk -INF, itu dijepit ke -1.0f.
  • Konversi dari skala float ke skala bilangan bulat: c = c * (2ⁿ⁻¹-1).
  • Konversi ke bilangan bulat sebagai berikut.
    • Jika c >= 0 maka c = c + 0,5f, jika tidak, c = c - 0,5f.
    • Jatuhkan pecahan desimal, dan nilai floating point (integral) yang tersisa dikonversi langsung ke bilangan bulat.

Konversi ini diizinkan toleransi D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (di sisi bilangan bulat). Ini berarti bahwa setelah mengonversi dari float ke skala bilangan bulat, nilai apa pun dalam D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place dari nilai format target yang dapat diwakili diizinkan untuk memetakan ke nilai tersebut. Persyaratan Invertability Data tambahan memastikan bahwa konversi tidak ditentukan di seluruh rentang dan semua nilai output dapat dicapai. (Dalam konstanta yang ditampilkan di sini, xx harus diganti dengan versi Direct3D, misalnya 10, 11, atau 12.)

UNORM FLOAT

Nilai n-bit awal dikonversi ke float (0,0f, 1,0f, 2,0f, dll.) dan kemudian dibagi dengan (2ⁿ-1).

FLOAT UNORM

Biarkan c mewakili nilai awal.

  • Jika c adalah NaN, hasilnya adalah 0.
  • Jika c > 1.0f, termasuk INF, itu dijepit ke 1.0f.
  • Jika c < 0,0f, termasuk -INF, itu dijepit ke 0,0f.
  • Konversi dari skala float ke skala bilangan bulat: c = c * (2ⁿ-1).
  • Konversi ke bilangan bulat.
    • c = c + 0,5f.
    • Pecahan desimal dihilangkan, dan nilai floating point (integral) yang tersisa dikonversi langsung ke bilangan bulat.

Konversi ini diizinkan toleransi D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (di sisi bilangan bulat). Ini berarti bahwa setelah mengonversi dari float ke skala bilangan bulat, nilai apa pun dalam D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place dari nilai format target yang dapat diwakili diizinkan untuk memetakan ke nilai tersebut. Persyaratan Invertability Data tambahan memastikan bahwa konversi tidak ditentukan di seluruh rentang dan semua nilai output dapat dicapai.

SRGB FLOAT

Berikut ini adalah konversi SRGB ke FLOAT yang ideal.

  • Ambil nilai n-bit awal, konversikan sebagai float (0,0f, 1,0f, 2.0f, dll.); panggil ini c.
  • c = c * (1,0f / (2ⁿ-1))
  • Jika (c < = D3Dxx_SRGB_TO_FLOAT_THRESHOLD) maka: result = c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1, else: result = (c + D3Dxx_SRGB_TO_FLOAT_OFFSET)/D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_2)D3Dxx_SRGB_TO_FLOAT_EXPONENT

Konversi ini diizinkan toleransi D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (di sisi SRGB).

FLOAT SRGB

Berikut ini adalah konversi FLOAT -> SRGB yang ideal.

Dengan asumsi komponen warna SRGB target memiliki n bit:

  • Misalkan nilai awalnya adalah c.
  • Jika c adalah NaN, hasilnya adalah 0.
  • Jika c > 1.0f, termasuk INF, dijepit ke 1,0f.
  • Jika c < 0,0f, termasuk -INF, itu dijepit ke 0,0f.
  • Jika (c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD) maka: c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 * c, else: c = D3Dxx_FLOAT_TO_SRGB_SCALE_2 * c(D3Dxx_FLOAT_TO_SRGB_EXPONENT_NUMERATOR/D3Dxx_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR) - D3Dxx_FLOAT_TO_SRGB_OFFSET
  • Konversi dari skala float ke skala bilangan bulat: c = c * (2ⁿ-1).
  • Konversi ke bilangan bulat:
    • c = c + 0,5f.
    • Pecahan desimal dihilangkan, dan nilai floating point (integral) yang tersisa dikonversi langsung ke bilangan bulat.

Konversi ini diizinkan toleransi D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (di sisi bilangan bulat). Ini berarti bahwa setelah mengonversi dari float ke skala bilangan bulat, nilai apa pun dalam D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place dari nilai format target yang dapat diwakili diizinkan untuk memetakan ke nilai tersebut. Persyaratan Invertability Data tambahan memastikan bahwa konversi tidak ditentukan di seluruh rentang dan semua nilai output dapat dicapai.

SINT SINT Dengan Lebih Banyak Bit

Untuk mengonversi dari SINT ke SINT dengan lebih banyak bit, bit paling signifikan (MSB) dari nomor awal adalah "sign-extended" ke bit tambahan yang tersedia dalam format target.

UINT SINT Dengan Lebih Banyak Bit

Untuk mengonversi dari UINT ke SINT dengan lebih banyak bit, angka disalin ke bit (LSB) format target yang paling tidak signifikan dan MSB tambahan diisi dengan 0.

SINT UINT Dengan Lebih Banyak Bit

Untuk mengonversi dari SINT ke UINT dengan lebih banyak bit: Jika negatif, nilai dijepit menjadi 0. Jika tidak, angka disalin ke LSB format target dan MSB tambahan diisi dengan 0.

UINT UINT Dengan Lebih Banyak Bit

Untuk mengonversi dari UINT ke UINT dengan lebih banyak bit, angka disalin ke LSB format target dan MSB tambahan diisi dengan 0.

SINT atau UINT SINT atau UINT Dengan Bit Lebih Sedikit atau Sama Dengan

Untuk mengonversi dari SINT atau UINT ke SINT atau UINT dengan bit yang lebih sedikit atau sama dengan (dan/atau perubahan signedness), nilai awal hanya dijepit ke rentang format target.

 

Konversi Bilangan Bulat Titik Tetap

Bilangan bulat titik tetap hanyalah bilangan bulat dari beberapa ukuran bit yang memiliki titik desimal implisit di lokasi tetap.

Jenis data "bilangan bulat" di mana-mana adalah kasus khusus dari bilangan bulat titik tetap dengan desimal di akhir angka.

Representasi angka titik tetap ditandai sebagai: i.f, di mana i adalah jumlah bit bilangan bulat dan f adalah jumlah bit pecahan. misalnya, 16,8 berarti bilangan bulat 16 bit diikuti oleh 8 bit pecahan. Bagian bilangan bulat disimpan dalam pelengkap 2, setidaknya seperti yang didefinisikan di sini (meskipun dapat didefinisikan secara merata untuk bilangan bulat yang tidak ditandatangani juga). Bagian pecahan disimpan dalam bentuk tidak ditandatangani. Bagian pecahan selalu mewakili pecahan positif antara dua nilai integral terdekat, dimulai dari yang paling negatif.

Operasi penambahan dan pengurangan pada angka titik tetap dilakukan hanya menggunakan aritmatika bilangan bulat standar, tanpa pertimbangan di mana desimal tersirat terletak. Menambahkan 1 ke angka titik tetap 16,8 berarti menambahkan 256, karena desimal adalah 8 tempat dari akhir angka yang paling tidak signifikan. Operasi lain seperti perkalian, dapat dilakukan juga hanya dengan menggunakan aritmatika bilangan bulat, asalkan efek pada desimal tetap diperhitungkan. Misalnya, mengalikan dua bilangan bulat 16,8 menggunakan bilangan bulat mengalikan menghasilkan hasil 32,16.

Representasi bilangan bulat titik tetap digunakan dalam dua cara dalam Direct3D.

  • Posisi vertex pasca-diklip di rasterizer diciutkan ke titik tetap, untuk mendistribusikan presisi secara seragam di seluruh area RenderTarget. Banyak operasi rasterizer, termasuk pemusnahan wajah sebagai salah satu contoh, terjadi pada posisi snapped titik tetap, sementara operasi lain, seperti pengaturan interpolator atribut, menggunakan posisi yang telah dikonversi kembali ke floating point dari posisi snapped titik tetap.
  • Koordinat tekstur untuk operasi pengambilan sampel diciutkan ke titik tetap (setelah diskalakan berdasarkan ukuran tekstur), untuk mendistribusikan presisi secara seragam di seluruh ruang tekstur, dalam memilih lokasi/bobot ketukan filter. Nilai bobot dikonversi kembali ke titik mengambang sebelum aritmatika pemfilteran aktual dilakukan.
Tipe Data Sumber Tipe Data Tujuan Aturan Konversi
FLOAT Bilangan Bulat Titik Tetap

Berikut ini adalah prosedur umum untuk mengonversi angka titik mengambang n ke bilangan bulat titik tetap i.f, di mana i adalah jumlah bit bilangan bulat (ditandatangani) dan f adalah jumlah bit pecahan.

  • Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • Jika n adalah NaN, hasil = 0; jika n adalah +Inf, result = FixedMax*2f; if n is -Inf, result = FixedMin*2f
  • Jika n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Jika tidak, komputasi n*2f dan konversi ke bilangan bulat.

Implementasi diizinkan D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP toleransi Unit-Last-Place dalam hasil bilangan bulat, alih-alih nilai tepat yang tak terbatas n*2f setelah langkah terakhir di atas.

Bilangan Bulat Titik Tetap FLOAT

Asumsikan bahwa representasi titik tetap tertentu yang dikonversi ke float tidak berisi lebih dari total 24 bit informasi, tidak lebih dari 23 bit di antaranya berada dalam komponen pecahan. Misalkan angka titik tetap tertentu, fxp, dalam bentuk i.f (bilangan bulat bit i, fraksi bit f). Konversi ke float mirip dengan pseudocode berikut.

hasil float = (float)(fxp >> f) + // ekstrak bilangan bulat

((float)(fxp & (2f - 1)) / (2f)); // ekstrak pecahan

 

Lampiran-lampiran