Piksel Indentasi Tekstur

Memperkenalkan artikel keempat dalam seri kami tentang bekerja dengan model 3D di Unity. Artikel sebelumnya: "Fitur bekerja dengan Mesh in Unity" , "Unity: editing prosedural Mesh" , "Impor model 3D ke dalam Unity and pitfalls" .

Pada artikel sebelumnya, kami menyebutkan memeriksa pemindaian tekstur untuk kecukupan indentasi piksel pada resolusi tekstur yang diberikan. Dalam publikasi ini, kami menjelaskan esensi masalah dengan mengamati indentasi piksel dan algoritma untuk melacaknya. Ini tidak akan dianggap kode, tetapi merupakan prinsip yang dapat diimplementasikan dalam bahasa apa pun dan dalam lingkungan pengembangan apa pun.



Masalah


Pesanan untuk model 3D biasanya disertai dengan persyaratan untuk resolusi tekstur. Karena sifat diskrit dari gambar raster, artis 3D harus mengamati lekukan dalam piksel antara bagian-bagian pemindaian tekstur. Tidak adanya lekukan yang diperlukan mengarah pada fakta bahwa piksel yang sama ditampilkan pada model di tempat yang sama sekali berbeda ketika tidak diperlukan.

Sangat penting untuk melacak indentasi yang cukup pada tahap awal pekerjaan. Paling sering, beberapa orang terlibat dalam penciptaan geometri, termasuk pemindaian tekstur, dan yang lain terlibat dalam menggambar tekstur. Kesalahan yang terdeteksi oleh artis 3D akan menyebabkan lebih sedikit masalah daripada yang akan ditemukan oleh perancang tekstur. Dalam kasus terakhir, situasinya menjadi lebih rumit jika paket 3D yang digunakan tidak menyediakan alat untuk menggambar geometri (misalnya, kuas).

Anda juga harus mempertimbangkan dua nuansa, karena di antara elemen-elemen sapuan mungkin memerlukan lebih banyak ruang. Yang pertama adalah penurunan resolusi tekstur selama pemetaan. Yang kedua adalah penggunaan filter pelebaran saat membentuk peta pencahayaan . Selama tugas membuat UV- scan, artis 3D perlu dipandu oleh persyaratan untuk resolusi tekstur, dan juga mempertimbangkan nuansa yang tercantum di atas. Namun demikian, banyak kekurangan tidak dapat diketahui tanpa verifikasi otomatis.


Contoh penampilan artefak dengan penurunan detail

Untuk model sederhana, pemindaian tekstur dapat dihasilkan menggunakan alat otomatis. Namun, mereka didasarkan pada metrik internal dan tidak memperhitungkan lekukan piksel, sehingga piksel bersama sering terletak di sepanjang batas diagonal. Memeriksa dengan tekstur checker tidak menunjukkan semua kesalahan, di samping itu, tekstur ini sering memiliki resolusi lebih tinggi daripada yang akan digunakan dalam proyek.


Pixel yang Dibagikan

Masalah lekukan piksel yang tidak mencukupi dalam pemindaian UV mirip dengan masalah overlay. Dalam kedua kasus, apa yang disebut perdarahan dapat terjadi - dalam artikel sebelumnya kami menggambarkan artefak apa yang dihasilkannya.

Namun, masalah lekukan piksel tergantung pada persyaratan resolusi tekstur minimum. Pemeriksaan tunggal sudah cukup untuk menentukan overlay, sedangkan persyaratan untuk resolusi tekstur dapat berubah pada tahap pengembangan selanjutnya. Situasi menjadi rumit oleh kenyataan bahwa paket 3D yang kami gunakan tidak memiliki alat untuk secara otomatis mendeteksi kesalahan terkait dengan kedekatan bagian-bagian dari pemindaian UV . Dan jangan lupa bahwa setelah operasi pembentuk otomatis di Unity, Anda masih perlu memeriksa UV2 .

Kami memutuskan untuk membuat alat yang dapat memeriksa lekukan dalam piksel dan menandai tempat celah potensial dalam model. Persyaratan indentasi akan ditentukan berdasarkan parameter berikut:

  1. Resolusi dasar tekstur.
  2. Resolusi minimum tekstur tempat aliran tidak diperbolehkan.
  3. Lekukan yang diperlukan pada tekstur minimum.

Karena ukuran tekstur yang digunakan oleh kami sama dengan kekuatan dua, rumus untuk menghitung lekukan yang diperlukan pada resolusi dasar cukup sederhana: (Resolusi dasar / Resolusi minimum) * indent pada MinTexture.

Jelas, solusi untuk masalah ini terkait erat dengan rasterisasi. Untuk pernyataan persyaratan dan pengembangan algoritma yang lebih jelas, kami memperkenalkan beberapa konsep.

Konsep kunci


Pertimbangkan ruang UV dan kisi seragam dimensi NxM dalam kisaran 0,01,0,0. Lebar sel 1 / N dan tinggi 1 / M membentuk partisi ruang UV .


NxM membelah ruang UV

Kami mengambil dua titik sembarang dan menunjukkan Dn sebagai jumlah piksel yang ditempati oleh proyeksi ke sumbu U dari segmen yang menghubungkan titik-titik yang diberikan. Demikian pula, Dm untuk sumbu V. Kemudian kita menentukan jarak piksel sebagai maksimum antara Dn dan Dm.


Jarak piksel

Perlu dicatat bahwa dalam ruang Euclidean, operasi gerakan seperti terjemahan paralel dan rotasi bukanlah gerakan untuk mesh, jika jarak piksel diambil sebagai metrik. Nuansa ini sedikit mempersulit pengembangan solusi kami.



Kami menyebut sebuah persegi dengan sisi dalam K piksel inti dari K. Kemudian dua titik dengan jarak piksel kurang dari K dapat dicakup oleh kernel K.


Contoh core dengan ukuran berbeda

Dua tepi poligon membentuk cekungan kontur jika titik tengahnya (pusat massa pada empat simpul) terletak di sebelah kiri tepi ini ketika mengelilingi kontur dalam arah searah jarum jam. Untuk lintasan berlawanan arah jarum jam, syaratnya adalah menemukan titik di sebelah kanan tepi.


Sepasang tulang rusuk membentuk cekungan kontur

Solusi


Sekarang mari kita bicara langsung tentang memeriksa lekukan piksel. Untuk mengimplementasikannya, kami datang dengan algoritma yang terdiri dari tiga fragmen independen. Urutan eksekusi tidak penting. Hasil dari masing-masing fragmen adalah matriks NxM, yang merupakan buffer dari sel-sel partisi, di mana beberapa sel diberi label. Penambahan ketiga buffer adalah hasil umum.

Pertama, pertimbangkan cuplikan paling sederhana. Ia datang untuk menemukan sel-sel yang bersinggungan dekat dengan segitiga dan tepi yang berdegenerasi, yang panjangnya kurang dari sisi inti dari magnitudo yang diberikan. Semua sel tersebut ditandai dalam buffer.


Hasil pengecekan ukuran elemen

Sebelum menjelaskan dua fragmen lainnya, pertimbangkan logika umum pekerjaan mereka. Keduanya terkait dengan pemrosesan kelompok segitiga yang disebut kerang atau pulau. Shell untuk artis 3D adalah himpunan poligon yang terhubung, yaitu, setiap poligon dalam himpunan ini memiliki tetangga yang dengannya ia berbagi simpul umum. Shell juga merupakan tempat pelatihan yang independen. Lebih lanjut, dengan shell, pulau dan cluster kami maksud hal yang sama.



Untuk menemukan semua cangkang, kami menggunakan algoritme pencarian untuk semua komponen grafik yang terhubung, di mana simpul grafik diwakili oleh poligon dan tepi oleh kehadiran simpul umum dalam sepasang poligon. Karena satu-satunya poligon dalam Unity adalah segitiga yang ditentukan oleh indeks titik, kami menganggap segitiga berdekatan jika setidaknya satu indeks dari titik pertama bertepatan dengan indeks dari setiap titik kedua. Dari analogi dengan grafik dan metode untuk menentukan tepi, dapat disimpulkan bahwa himpunan indeks simpul dari satu cluster tidak berpotongan dengan himpunan simpul yang lain.



Dengan bagian umum selesai. Fragmen kedua, yang akan kami pertimbangkan, menentukan lokasi kesalahan potensial yang terkait dengan kedekatan atau tumpang tindih cluster yang berbeda.

Banyak cluster diumpankan ke input dalam bentuk set segitiga di ruang UV , dimensi pemisahan UV sesuai dengan resolusi tekstur (NxM), dan nilai lekukan P sebagai jumlah piksel. Untuk partisi yang diberikan, perlu untuk menemukan daerah-daerah di mana jarak dalam piksel antara cluster kurang dari indentasi yang diperlukan. Sel dalam matriks hasil ditandai jika memasuki setidaknya satu inti dari nilai K = P + 1 , yang memotong dua kelompok yang berbeda.

Esensi dari fragmen ini hampir diatur dalam deskripsi hasil. Penting untuk menemukan semua kernel dengan magnitudo K yang bersinggungan dengan segitiga dari cangkang yang berbeda, dan kemudian menandai sel-sel inti ini dalam buffer hasil.

Dalam implementasi kami, semua pasangan cluster dipertimbangkan secara bergantian. Untuk masing-masing pasangan, daerah persimpangan dari set kernel dengan magnitudo K yang tercakup oleh kluster ini ditentukan. Pilih pasangan dan tunjukkan set seperti Q.



Kemudian, semua elemen Q harus diperiksa dengan kriteria berikut: apakah kernel yang diberikan berpotongan setidaknya satu segitiga di setiap cluster dari pasangan yang dipilih. Jika demikian, maka semua sel dari kernel yang diuji ditandai.



Buffer dengan sel yang ditandai untuk semua pasangan cluster merupakan hasilnya.


Hasil Indentasi Cluster

Sekarang kita akan berurusan dengan fragmen terakhir. Di sini Anda perlu memproses satu cluster. Input adalah seperangkat segitiga dalam ruang UV , dimensi partisi UV yang sesuai dengan resolusi tekstur (NxM), dan nilai lekukan P sebagai jumlah piksel. Sel dapat ditandai dalam dua kasus: apakah cluster tidak valid atau memiliki lubang, atau jarak dalam piksel antara tepi konkavitas kurang dari indent yang diperlukan.

Bagian dalam cluster tidak menarik bagi kami - untuk permulaan kami akan mendapatkan garis besarnya diwakili oleh daftar tepi yang terhubung. Segitiga yang bertetangga menduplikasi indeks dari simpul, sehingga tepi menjadi bagian dari kontur jika sepasang indeks dari simpulnya unik untuk himpunan tepi cluster. Setelah mengetahui tepi mana yang membentuk kontur, perlu untuk menyusunnya sehingga daftar tertaut diperoleh.

Jika setelah langkah ini tidak semua tepi kontur masuk ke daftar, maka apakah cluster memiliki lubang, atau ada kesalahan dalam data mesh. Dalam hal ini, perlu untuk menandai semua sel nuklei yang berpotongan dengan gugus dengan tepat.

Jika kontur ditemukan, maka pemrosesan berlanjut. Kami merumuskan persyaratan hasil berikut. Biarkan pasangan tepi membentuk cekung kontur memotong kernel K = P + 1 . Maka sel-sel nukleus harus ditandai jika kedua bagian kontur antara sisi melampaui nukleus ini.


Hasil Uji Fitur Cluster

Kami memutuskan untuk menerapkan persyaratan ini melalui perbandingan sisi tepi kontur secara berpasangan. Kita mulai dengan kondisi cekungan, kemudian untuk setiap pasangan semua kernel yang memotong kedua sisi diperiksa. Untuk menguji kernel, dilakukan traversal pada setiap bagian dari kontur antara sepasang tepi. Jika setiap bagian mengandung setidaknya satu titik di luar batas nukleus, maka semua sel nukleus ditandai.


Kondisi di mana sel-sel kernel diperiksa ditandai

Ringkasan


Algoritma di atas sangat cocok untuk implementasi menggunakan komputasi paralel. Pemrosesan masing-masing pasangan cluster dan edge terjadi secara independen. Karena pemeriksaan didasarkan pada rasterisasi, jika Anda mulai memproses bukan dengan pasang sisi, tetapi dengan inti, disarankan untuk menggunakan kemampuan GPU .

Kami mengubah hasil algoritme menjadi tekstur. Untuk resolusi yang diberikan, ini memungkinkan Anda untuk secara grafis menunjukkan tempat-tempat kelemahan potensial dalam pemindaian UV . Juga, tekstur yang dihasilkan dapat diterapkan pada model untuk melihat tanda langsung pada geometri.

Pada contoh di bawah ini, kami khusus memotong kelinci dan Suzanne dengan alat otomatis Blender sehingga kami mendapatkan lebih banyak artefak. Resolusi tekstur yang diperiksa adalah 256x256, indentasi yang diperlukan adalah 1.

Sel-sel ditandai dalam kelompok penutup biru dengan lubang, serta segitiga dan tepi yang terlalu kecil. Hijau menunjukkan inti sel dengan karakteristik masing-masing kelompok secara individual. Kernel di mana indentasi antar cluster tidak diamati ditandai dengan warna merah.

Contohnya




Pada artikel selanjutnya, kami akan mempertimbangkan algoritma untuk mengoptimalkan model 3D dalam sebuah adegan dengan menghapus geometri yang tidak terlihat. Tetap bersama kami!

Source: https://habr.com/ru/post/id451794/


All Articles