* Work
* Fun
* Hobby
* Pix
* Twits
Dasar Rendering MinGL Bekerja
15 November 2009
Sebelumnya,
saya menjelaskan motivasi saya untuk melakukan sesuatu yang konyol
seperti menulis perangkat lunak rasterizer di underfeatured hari ini
dan usia.
Yah, aku mencetak OpenGL ES 1.x spesifikasi, dan saya sudah melakukan sedikit benturan menjauh. Beberapa tersangka yang membangkitkan kemarahan:
* SSE sucks. Seperti
kata Max pada hari Jumat, dengan SSE4 +, mereka telah mendapatkan semua
cara sampai 75% dari vektor yang baik instruksi set!
* Saya berharap ada lingkungan debug yang lebih baik pada Ubuntu. I haven't tried antarmuka asli pada 2,2 MonoDevelop belum, mungkin itu akan menyelamatkan aku.
*
Dan tentu saja bodoh biasa C + + omong kosong, tapi hei, "Hanya ada dua
jenis bahasa: orang-orang yang mengeluh dan yang tidak ada yang
menggunakan." Jadi aku akan melewatkan bahwa untuk hari ini.
Ternyata OpenGL tidak terlalu cocok untuk (non-jitting) implementasi perangkat lunak. Bahkan
dalam dikupas-bawah, kurang-featureful, fixed-fungsi ES versi yang 1.0,
ada yang durhaka jumlah titik penyisipan di mana pipa dapat ulang. Untuk
menghindari runtime switching di tingkat terendah bagian dari
rasterization (yaitu menggambar scanline), akan ada perlu ratusan
berbeda "shader" untuk fungsi tetap. Contoh:
*
dhuwur warna (bool)
*
texture0 (bool)
*
texture1 (bool)
*
kabut (4 mungkin persamaan)
*
tekstur metode sampling (6 metode yang berbeda tekstur * 2 unit)
*
warna topeng (bool)
*
kedalaman topeng (bool)
*
stensil topeng (bool)
*
semua fragmen ops:
o pixel kepemilikan (bool)
o gunting (bool)
o alpha test (bool)
o stensil tes (bool)
o tes kedalaman (bool)
o pencampuran (11 paduan fungsi)
o Logika ops (16 logika ops)
Ini tidak termasuk tingkat dhuwur operasi, hanya tingkat fragmen, dan aku yakin aku masih hilang beberapa. Itu juga hanya untuk dua unit tekstur, yang merupakan spesifikasi minimum memungkinkan. Anda harus melakukan beberapa lebih x2's untuk setiap unit tekstur tambahan. Permuting keluar semua kombinasi, hanya dengan apa yang ada di sana meskipun sudah 17.301.504 shader! Jadi, jelas bahwa tidak akan bekerja.
Itu
masuk akal (mungkin) untuk membuat semua bagian dari hardware pipa
untuk tambahan sedikit di atas kepala, tapi ada crapload pemeriksaan,
pengujian, dan melompat terjadi untuk melakukannya di tingkat perangkat
lunak.
Alternatif lain akan menjadi generasi runtime melalui JITing. Ini jatuh di luar MinGL apa yang akan dilakukan. Platform
yang ditargetkan mencakup x86, x64, PPC32, dan ppc64 minimal yang
terlalu banyak kode untuk menjejalkan ke dalam sebuah header. Ini juga tidak mungkin untuk JIT pada semua platform saya ingin menjalankannya di atas, khususnya Xbox 360 dan PS3.
Jadi, kurasa aku harus melakukan sesuatu seperti ini 10-100 mengambil "shader" yang tampak seperti pengaturan rata-rata. e.g. kedalaman tex0 + tes + noblending, atau tidak ada kedalaman warna + tes + one_minus_src_alpha, dan seterusnya. Ini
akan menjadi cepat (er) mudah-mudahan jalan yang digunakan 95% + dari
waktu, dan pengaturan lainnya harus jatuh kembali di
uber-do-all-tes-di-runtime shader.
Kemajuan
Supaya
jangan tampaknya seperti semua berita buruk, aku sudah mengurutkannya
jalan melalui bongkahan baik dari vertex pipeline, dan telah menulis
beberapa dari mereka cepat-jalur shader. Inilah
yang selalu menarik Gouraud + gelap dalam kasus ini, melakukan apa yang
mungkin adalah versi 3D "Halo, dunia!": Sebuah kubus yang berputar
berwarna primer.
Saya
juga memasukkan kode di code.google, pada kesempatan off Anda ingin
trik mengeluarkan matematika vektor SSE perpustakaan, atau pamer gila
anda optimasi skillZ pemetaan tekstur, memiliki itu.