Cara melukis ke model 3d
Saya telah mencari topik ini untuk waktu yang lama dan pada dasarnya tidak menemukan informasi tentangnya.
Jika kita memiliki model 3d dengan tata letak uv. Apa teknik dasar melukis 3d pada model tersebut dengan kuas? Sebuah sapuan kuas terdiri dari data / gambar piksel kuas yang disusun secara berurutan. Jadi, apakah kita memproyeksikan setiap gambar kuas ke permukaan objek? (Meskipun sebenarnya untuk melakukan ini, kami akan memproyeksikan objek ke ruang gambar sebagai gantinya). Saya telah berhasil memproyeksikan tekstur ke objek sebelumnya. Dan memproyeksikan masing-masing gambar kuas tampaknya dapat dilakukan, tetapi saya tidak yakin apakah praktis dari sudut pandang kinerja dan apakah ada teknik yang lebih baik.
Jawaban
Saya tidak bisa memberi Anda pendekatan yang "lebih baik" di sini, tapi saya pikir pendekatan itu
memproyeksikan setiap gambar kuas ke permukaan objek
sebenarnya bukan masalah kinerja jika Anda menerapkannya menggunakan GPU. Terutama di lingkungan editor, di mana tidak banyak hal yang terjadi dibandingkan dengan game komputer. Yang pada dasarnya ingin Anda lakukan adalah merender satu gambar per bingkai ke dalam kumpulan tekstur terbatas. Saya dapat memberi Anda konsep tentang bagaimana saya akan mendekati subjek jika saya membutuhkan fitur ini. Namun, karena saya belum menerapkannya sendiri, mungkin ada beberapa komplikasi dan masalah yang belum saya pikirkan, jadi beri tahu saya di komentar jika ada yang tidak berfungsi seperti yang diharapkan.
Temukan permukaan yang terkena
- Gunakan sudut tekstur kuas Anda dan hasilkan frustrasi proyeksi kuas yang berkurang
- Periksa semua objek terhadapnya dan temukan permukaan terdekat -> Jika Anda sudah menggunakan semacam pemusnahan untuk adegan Anda, gunakan kembali daftar objek yang telah disisihkan, karena kuas hanya dapat "melihat" apa yang dilihat kamera
- Identifikasi sub-permukaan / segitiga yang dipengaruhi oleh kuas
Kumpulkan semua tekstur yang terpengaruh. Anda harus tahu untuk setiap permukaan yang terpengaruh, tekstur mana yang dimilikinya. Secara optimal, seluruh objek Anda hanya memiliki satu tekstur UV.
Buat program shader untuk merender tekstur Anda.
- hati-hati, vertex shader harus menghitung koordinat UV yang dinormalisasi dan meneruskannya ke pipa sebagai posisi vertex, karena itu adalah posisi dalam tekstur Anda. Periksa informasi tambahan apa yang Anda perlukan untuk meneruskan pipeline.
- Di shader fragmen, timpa setiap piksel yang berada di bawah kuas. Anda mungkin perlu menggunakan pencampuran di sini untuk kuas non-persegi panjang.
- Posisi kuas sedikit rumit. Anda membutuhkannya di ruang UV tekstur di shader fragmen dan saya tidak yakin apakah Anda dapat menghitungnya di shader vertex. Jadi, Anda mungkin perlu melakukannya di shader fragmen atau di shader geometri. Masalah yang saya lihat adalah bahwa sudut di mana proyeksi kuas menyentuh permukaan tidak dapat dihitung dalam shader vertex dan diperlukan untuk menentukan area yang tertutup. Shader geometri memiliki informasi yang cukup untuk menghitung sudut dan area tertutup. Di shader fragmen, Anda juga tidak dapat menghitung sudutnya, tetapi di sana Anda cukup memeriksa apakah dan di mana lokasinya di frustrasi proyeksi kuas.
Sekarang render tekstur Anda.
- Ikat tekstur kuas Anda
- Untuk setiap tekstur yang terpengaruh
- Ikat tekstur sebagai target render
- Render semua objek yang terpengaruh dan biarkan GPU memilah piksel mana yang perlu ditimpa.
(Opsional) Jika Anda ingin menyimpan modifikasi Anda, Anda perlu membaca kembali tekstur dari GPU dan menyimpannya.
Karena pekerjaan utama dilakukan oleh GPU, seharusnya cukup cepat. Namun, saya dapat melihat beberapa masalah dengan pendekatan yang dijelaskan saat kuas mengenai beberapa objek / tekstur yang sebagian tumpang tindih. Menyortir piksel mana dari kuas yang memengaruhi tekstur / objek mana yang bisa menjadi berantakan. Mungkin ada beberapa trik penyangga stensil / kedalaman yang dapat diterapkan, tetapi saya pikir ini adalah topik untuk pertanyaan lain.
Selama tidak ada piksel pada tekstur yang digunakan dua kali, Anda dapat merender geometri dan menampilkan koordinat uv (koordinat tekstur). Biasanya mereka adalah kombinasi dari merah dan hijau (2d). Saat menggunakan kuas, Anda hanya perlu membaca koordinat uv yang telah Anda tekan dan mewarnai tekstur pada posisi (uv) dengan warna yang diinginkan.
Petunjuk: cat pada tekstur kedua, jadi Anda tidak akan merusak warna tekstur aslinya.
Kekurangan: Terkadang resolusi tekstur berbagai segitiga dalam geometri bervariasi. Jadi di beberapa wajah itu akan terlihat bagus, dan di lain itu akan menjadi piksel.
Seperti yang dikatakan sebelumnya, jika jala (geometri) menggunakan bagian tekstur yang sama dua kali (dua wajah mengarah pada koordinat tekstur yang sama), dan Anda menggambar salah satunya, yang lain juga akan dicat.
Anda dapat melakukannya dengan berbagai cara.
Tetapi cara yang paling logis bagi saya adalah bahwa ada titik-titik yang diambil sampelnya di sepanjang jalur, kemudian kurva splines / benzier digunakan untuk membuatnya mulus (titik-titik tambahan dapat diinterpolasi), setelah itu diproyeksikan dan disimpan pada tekstur. Jadi tidak ada poin "setiap" yang harus diambil sampelnya.