Bias Kedalaman

Poligon yang merupakan koplanar dalam ruang 3D dapat dibuat untuk muncul seolah-olah mereka tidak koplanar dengan menambahkan bias z (atau bias kedalaman) ke masing-masing.

Ini adalah teknik yang umum digunakan untuk memastikan bahwa bayangan dalam adegan ditampilkan dengan benar. Misalnya, bayangan di dinding kemungkinan akan memiliki nilai kedalaman yang sama dengan dinding. Jika aplikasi merender dinding terlebih dahulu dan kemudian bayangan, bayangan mungkin tidak terlihat, atau artefak kedalaman mungkin terlihat.

Aplikasi dapat membantu memastikan bahwa poligon koplanar dirender dengan benar dengan menambahkan bias (dari anggota DepthBiasdari D3D11_RASTERIZER_DESC1) ke nilai z yang digunakan sistem saat merender set poligon koplanar. Poligon dengan nilai z yang lebih besar akan digambar di depan poligon dengan nilai z yang lebih kecil.

Ada dua opsi untuk menghitung bias kedalaman.

  1. Jika buffer kedalaman saat ini terikat ke tahap output-merger memiliki format UNORM atau tidak ada buffer kedalaman yang terikat, nilai bias dihitung seperti ini:

    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    

    di mana r adalah nilai > minimum yang dapat diwakili 0 dalam format buffer kedalaman yang dikonversi ke float32. Nilai DepthBias dan SlopeScaledDepthBiasD3D11_RASTERIZER_DESC1 anggota struktur. Nilai MaxDepthSlope adalah maksimum lereng horizontal dan vertikal dari nilai kedalaman pada piksel.

  2. Jika buffer kedalaman floating-point terikat ke tahap output-merger, nilai bias dihitung seperti ini:

    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    

    di mana r adalah jumlah bit mantissa dalam representasi floating point (tidak termasuk bit tersembunyi); misalnya, 23 untuk float32.

Nilai bias kemudian dijepit seperti ini:

if(DepthBiasClamp > 0)
    Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
    Bias = max(DepthBiasClamp, Bias)

Nilai bias kemudian digunakan untuk menghitung kedalaman piksel.

if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
    z = z + Bias

Operasi bias kedalaman terjadi pada simpul setelah kliping, oleh karena itu, bias kedalaman tidak berpengaruh pada kliping geometris. Nilai bias konstan untuk primitif tertentu dan ditambahkan ke nilai z untuk setiap vertex sebelum penyiapan interpolator. Saat Anda menggunakan tingkat fitur 10.0 dan yang lebih tinggi, semua perhitungan bias dilakukan menggunakan aritmatika titik mengambang 32-bit. Bias tidak diterapkan ke titik atau primitif garis apa pun, kecuali untuk garis yang digambar dalam mode bingkai kawat.

Salah satu artefak dengan bayangan berbasis buffer bayangan adalah jerawat bayangan, atau permukaan yang membayangi dirinya sendiri karena perbedaan kecil antara komputasi kedalaman dalam shader, dan kedalaman permukaan yang sama di buffer bayangan. Salah satu cara untuk meringankan ini adalah dengan menggunakan DepthBias dan SlopeScaledDepthBias saat merender buffer bayangan. Idenya adalah mendorong permukaan cukup keluar saat merender buffer bayangan sehingga hasil perbandingan (antara buffer bayangan z dan shader z) konsisten di seluruh permukaan, dan menghindari bayangan diri lokal.

Namun, menggunakan DepthBias dan SlopeScaledDepthBias dapat memperkenalkan masalah penyajian baru ketika poligon yang dilihat pada sudut yang sangat tajam menyebabkan persamaan bias menghasilkan nilai z yang sangat besar. Ini berlaku mendorong poligon sangat jauh dari permukaan asli di peta bayangan. Salah satu cara untuk membantu meringankan masalah khusus ini adalah dengan menggunakan DepthBiasClamp, yang menyediakan batas atas (positif atau negatif) pada besarnya bias z yang dihitung.

Catatan

Untuk tingkat fitur 9.1, 9.2, 9.3, DepthBiasClamp tidak didukung.

 

Tahap Output-Merger