Aturan Konversi Data
Bagian berikut menjelaskan cara Direct3D menangani konversi antar jenis data.
- Terminologi Tipe Data
- Konversi Titik Mengambang
- Konversi Bilangan Bulat
- Konversi Bilangan Bulat Titik Tetap
- Topik terkait
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.
|
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.
|
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.
|
SRGB | FLOAT | Berikut ini adalah konversi SRGB ke FLOAT yang ideal.
|
FLOAT | SRGB | Berikut ini adalah konversi FLOAT -> SRGB yang ideal. Dengan asumsi komponen warna SRGB target memiliki n bit:
|
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.
|
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
|
Topik terkait