Buat bangunan perawatan yang indah dengan Cetak Biru

Pendahuluan


Cetak biru bangunan prosedural adalah ide yang menggoda. Menggunakan modul standar dan penempatan otomatis cukup logis, karena, bagaimanapun juga, ini adalah arsitektur yang sama. Tetapi bagaimana kita, ketika mengirim pesan teks, mencapai keanekaragaman alam alih-alih pengulangan?

Bangunan ini dibuat hanya dari satu modul, yang secara otomatis disalin ke Konstruksi Cetak Biru . Idenya adalah bahwa materi tersebut tidak memerlukan hampir semua entri data manual. Hanya satu bahan yang digunakan untuk seluruh bangunan (tidak termasuk jendela). Fungsinya digunakan untuk mengontrol pengacakan warna simpul dan posisi piksel di ruang dunia.


Hanya modul yang kita butuhkan


Tidak ada penempatan manual atau skrip. Semua pengacakan dilakukan dalam materi.

Materi yang dijelaskan dalam tutorial ini:

  • Memiliki lapisan kotoran yang tergantung ketinggian yang hanya menutupi objek hingga ketinggian absolut yang ditentukan
  • Memilih warna objek untuk setiap lantai dan segmen secara acak
  • Sedikit menggeser posisi benda kecil, juga secara acak
  • Mengizinkan pengguna memilih 2 warna untuk dinding, serta nilai kehancurannya


Warna vertex sebagai data


03:34

Selain posisi simpul dan normal, mesin game biasanya memberikan akses ke nilai-nilai lain, misalnya warna simpul. Saat menaungi segitiga jala, warnanya diinterpolasi di antara simpul. Anda dapat menggambarnya di editor 3D atau menggunakan tab Paint di UE. Jika Anda melakukan ini di mesin, maka Anda akan memiliki kesempatan untuk memodifikasi contoh terpisah dari mesh di dunia. Saya menjelaskan kasus penggunaan ini dalam tutorial menggambar simpul . Namun, dalam hal ini, kami akan tetap menggunakan warna yang diimpor, karena saya memutuskan untuk menggunakan saluran RGB sebagai topeng yang mengontrol pengacakan.


Jangan lupa bahwa warna dalam grafik 3D hanyalah vektor tiga komponen . Komponen-komponennya adalah kecerahan merah, hijau dan biru pada kisaran 0 - 1. Nilainya berubah-ubah, karena warna dari titik hanya data. Alih-alih menggunakannya secara langsung untuk melukis tekstur, saya memutuskan untuk mengemas warna-warna topeng di setiap saluran:

  • Saluran merah adalah topeng warna primer dan sekunder dari dinding . Poligon dengan nilai 0 menggunakan warna primer, dengan 1 - warna sekunder.
  • Saluran hijau - digunakan untuk memilih warna dari palet . Ini memungkinkan Anda untuk mengontrol variasi warna barang-barang kecil, seperti mengeringkan pakaian. Nilai antara 0 dan 1 dibulatkan ke indeks (posisi UV) dalam tekstur palet.
  • Saluran biru - mengimbangi posisi titik untuk menggerakkan titik secara horizontal. Ini berarti 0 akan digunakan untuk dinding (tidak ada gerakan), dan nilai hingga 1 dapat diberikan ke AC atau linen. Saluran ini juga mengontrol visibilitas (topeng opacity). Jika nilainya lebih besar dari 0, maka nilai acak ditambahkan, masing-masing untuk setiap segmen bangunan, untuk menciptakan variabilitas.

Dalam editor 3D yang serius, ada fungsi untuk melukis warna simpul. Anda dapat dengan mudah menemukan petunjuk tentang cara melakukan ini di editor Anda. Hanya ingat untuk memberi tahu Unreal Engine di jendela impor jala sehingga ia mengganti ( Ganti ) warna simpul (daripada mengabaikannya ( Abaikan )).

Seperti yang saya katakan di atas, warna dalam proyek ini adalah satu set nilai yang tepat. Untuk tugas serupa, dan hampir semua tugas teknis seni gim, saya lebih suka menggunakan Houdini . Namun, hasil yang serupa dapat dicapai (dengan sedikit usaha) di editor 3D lainnya. Perhatikan saja apa yang harus ditunjukkan oleh setiap saluran warna dalam shader.

Saya menyoroti seluruh proses pemberian nilai ke saluran warna titik dalam tutorial terpisah: Menyimpan data dalam warna titik menggunakan Houdini . Dalam tutorial ini, saya menggunakan alat Houdini yang rumit untuk membuat proses lebih efisien.

Cetak biru konstruksi


07:57

Cetak biru yang saya buat sederhana. Ini hanya menciptakan dinding datar bangunan, menduplikasi mesh secara horizontal dan vertikal. Ini memiliki variabel bisa berubah MeshWall (Static Mesh), NumberOfFloors (integer), NumberOfSegments (integer) dan Material .


Hasil cetak biru: 4 lantai, 2 segmen.

Seluruh proses dilakukan dalam Skrip Konstruksi, mis. selama pengeditan level. Berkat ini, mesh yang dihasilkan akan berperilaku seperti objek statis lainnya. Misalnya, akan diperhitungkan saat membangun pencahayaan.


Dimensi mesh diukur pertama kali. Panjang perbatasan berarti setengah dari ukuran objek. Kita dapat menghitungnya sekali dan menyimpan, karena untuk semua segmen nilainya akan sama.


Sisa kode berjalan dalam dua siklus. Loop luar menciptakan lantai secara keseluruhan, loop dalam menciptakan segmen di dalam lantai saat ini. Lokasi dihitung dengan indeks iterasi loop dikalikan dengan lebar dan tinggi mesh.



Komponen jala statis baru ditambahkan ke setiap segmen. Dalam beberapa kasus, akan berguna untuk menggunakan instance. Menambahkan komponen mengarah ke peningkatan jumlah panggilan draw, yang dalam adegan "berat" dapat menyebabkan masalah.


Itu saja. Saat mengatur NumberOfFloors dan NumberOfSegments baru, bangunan akan diperbarui secara otomatis.

Dua warna dinding ditutupi oleh warna titik


21:16


Kedua warna diakses sebagai parameter. Saluran merah warna simpul digunakan sebagai koefisien pencampuran di antara mereka.


Saluran pengemasan dan pencampuran


14:22


Kami ingin warna dinding hanya mempengaruhi dinding itu sendiri, tetapi tidak mempengaruhi bingkai jendela dan pendingin udara. Juga, mereka seharusnya tidak mempengaruhi area yang rusak. Ini dapat dilakukan dengan membungkus topeng di saluran alfa dari warna dasar. Dengan kata lain, tekstur warna dasar memiliki latar belakang transparan, dan di sanalah warna dinding terpengaruh.

Ngomong-ngomong, saya mengemas metalness tekstur, kekasaran dan oklusi (semua dalam nuansa abu-abu) ke dalam saluran R / G / B dengan tekstur yang sama . Ini mengurangi jumlah sampler, file, dan Lerp sebanyak tiga kali - optimisasi hebat yang tidak memerlukan kompromi. Tutorial tentang teknik ini dapat ditemukan di catatan.


Kebisingan dari tekstur



Pola noise ini digunakan untuk memadukan antara set tekstur pertama (bersih) dan kedua (rusak). Alih-alih menghitungnya secara real time, yang untuk noise berkualitas tinggi akan menjadi prosedur yang mahal, saya hanya memuatnya dari tekstur. Node WorldAlignedTexture memproyeksikannya dari tiga sisi ( ini menghasilkan koordinat UV secara prosedural ).


Kotoran tergantung tinggi. Fungsi Remap


18:00


Kotoran adalah warna datar yang diterapkan oleh gradien di ruang dunia. Komponen Z dari posisi piksel di dunia dikonversi ke interval 0-1. Ini memberi kita topeng yang berguna - koefisien Lerp . Minimum awal dan maksimum (misalnya, dari 150 hingga 700 cm) ditransmisikan oleh pengguna sebagai parameter skalar. Sedikit suara ditambahkan untuk membuat transisi lebih alami.



Fungsi TAA_Remap_01_Clamped dibuat oleh saya. Saya menggunakannya di hampir semua shader. Ini mengubah nilai dalam interval sumber ke interval 0-1. Bagus untuk membuat topeng berdasarkan jarak (dari kamera, dari tanah, atau bahkan untuk bentuk di ruang UV).

Pengacakan warna, elemen tersembunyi


10:55 malam


Memperoleh nilai acak dari titik referensi dari posisi segmen memungkinkan Anda untuk menggeser palet warna untuk objek kecil. Palet adalah tekstur dengan warna-warna yang selaras secara horizontal, jadi memindahkan gambar yang digunakan untuk membaca memberi kita warna akhir.



Tekstur palet pada skala diperbesar. Ukurannya yang biasa adalah 8 × 1 piksel dengan kompresi dinonaktifkan


Saluran warna simpul hijau berfungsi sebagai nilai pengacakan dan topeng. Nilai 0 berarti "tidak berlaku warna di sini."


Terapkan offset posisi lokal



Fungsi terakhir adalah untuk memindahkan objek secara acak di sepanjang sumbu X. Untuk melakukan ini, posisi offset yang dikontrol bahan ditambahkan ke simpul. Saat menggunakan trik ini, Anda harus memperhatikan dua hal - tabrakan kompleks (untuk pemotretan) dan bidang jarak. Parameter satu dan lainnya tidak tahu bahwa offset semacam itu telah dilakukan.

Saya akan mengambil saluran biru lagi dan menambahkan nomor acak - suara yang sama berdasarkan posisi segmen yang kami gunakan sebelumnya. Mari kita konversi dari interval 0-1 ke interval dari -0,5 ke 0,5, sehingga gerakan dilakukan di kedua arah. Lalu kita kalikan dengan PositionOffsetStrength . Node Tambah akan menambahkan sumbu yang tersisa (konstan 0 pada Y dan Z).

Secara tak terduga, Unreal mengharuskan output diimbangi dalam koordinat dunia . Kami menghitung posisi lokal . Bagaimana cara mengubahnya?

Ini dapat dilakukan dengan mengubah ruang posisi lokal baru ini menjadi ruang dunia menggunakan Transform node. Lalu saya kurangi posisi awal vertex di dunia dari posisi vertex baru ini, membuat dunia mengimbangi alih-alih posisi. Kombinasikan ini dengan rilis materi Offset Posisi Dunia , dan di situlah pekerjaan dilakukan.


Bahan jadi


Saya harap Anda mempelajari sesuatu yang baru dari tutorial ini. Berikut adalah tangkapan layar dari seluruh grafik simpul materi:


File dan Diskusi Proyek


Anda dapat mengunduh file proyek secara gratis (atau untuk sumbangan, jika diinginkan): file proyek . Jika Anda memiliki umpan balik atau pertanyaan, maka bergabunglah dengan diskusi di Reddit .

Bacaan tambahan


  • Cara mudah untuk mengemas tekstur ke saluran RGB adalah dengan menyimpan tiga tekstur abu-abu ke saluran gambar RGB tunggal menggunakan Photoshop. Pengemasan memungkinkan Anda menghemat ruang dan, yang lebih penting, mendapatkan tiga tekstur dalam satu operasi baca. Ini sepadan dengan usaha karena membaca tekstur dari memori adalah salah satu operasi GPU yang paling memakan waktu.

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


All Articles