Aturan Konversi Data

Bagian berikut menjelaskan cara Direct3D menangani konversi antar jenis data.

Terminologi Tipe Data

Kumpulan istilah berikut kemudian digunakan untuk mencirikan berbagai konversi format.

Istilah 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 peta 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 peta 10001 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 sekumpulan representasi bilangan bulat untuk nilai titik mengambang berspasi 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 mengambang berspasi 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. Bilangan bulat pelengkap 2. 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 tanjakan 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).

 

Konversi Titik Mengambang

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

Berkonverversi 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 di dokumentasikan 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-ke-tetap 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 Denorm 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 lainnya. Hanya konversi yang benar-benar terjadi di Direct3D yang ditampilkan.

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 lainnya dikonversi ke float (sebut saja c), lalu hasil = c * (1,0f / (2⁽ⁿ⁻¹⁾-1)). Misalnya nilai 5-bit 10001 dikonversi menjadi -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, maka akan dijepit ke 1,0f.
  • Jika c < -1.0f, termasuk -INF, maka akan 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 ditunjukkan 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.) lalu dibagi dengan (2ⁿ-1).
FLOAT UNORM Biarkan c mewakili nilai awal.
  • Jika c adalah NaN, hasilnya adalah 0.
  • Jika c > 1.0f, termasuk INF, maka akan dijepit ke 1,0f.
  • Jika c < 0,0f, termasuk -INF, maka akan 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 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, maka akan 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) paling tidak signifikan format target 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 Yang 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 yang tidak ditandatangani. Bagian pecahan selalu mewakili pecahan positif antara dua nilai integral terdekat, mulai 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 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 di Direct3D.

  • Posisi verteks pasca-diklip di rasterizer ditekan 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 diposisikan ke titik tetap (setelah diskalakan berdasarkan ukuran tekstur), untuk mendistribusikan presisi secara seragam di seluruh ruang tekstur, dalam memilih lokasi/bobot ketuk 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 bilangan floating point n menjadi bilangan bulat titik tetap yaitu, 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, hasil = FixedMax*2f; jika n adalah -Inf, hasil = FixedMin*2f
  • Jika n >= FixedMax, hasil = Fixedmax*2f; jika n <= FixedMin, hasil = 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 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 yang berada dalam komponen pecahan. Misalkan angka titik tetap yang diberikan, fxp, dalam bentuk i.f (bilangan bulat bit i, pecahan bit f). Konversi ke float mirip dengan pseudocode berikut.
float result = (float)(fxp >> f) + // extract integer
((float)(fxp & (2f - 1)) / (2f)); ekstrak pecahan

 

Sumber daya (Direct3D 10)