Pemisahan Tekstur Terrain Tingkat Lanjut

gambar


Pada artikel ini saya akan menjelaskan algoritma tekstur splatting yang memungkinkan Anda membuat medan yang lebih alami. Algoritma ini dapat digunakan dalam shader game 3D maupun game 2D.


Salah satu cara paling umum untuk tekstur medan adalah memadukan beberapa lapisan ubin. Setiap lapisan memiliki peta opacity yang menentukan tingkat kehadiran tekstur di medan. Metode ini bekerja dengan menerapkan peta opacity ke tingkat yang lebih tinggi, mengungkapkan lapisan di bawahnya di mana peta opacity sebagian atau sepenuhnya transparan. Peta opacity diukur dalam persentase. Tentu saja pada setiap titik medan jumlah kekeruhan dari semua lapisan menghasilkan seratus persen karena medan tidak dapat transparan. Alih-alih tekstur ubin, peta opacity membentang sepenuhnya di semua medan dan karenanya memiliki tingkat detail yang cukup rendah.


Sekarang kita akan beralih ke bagian yang paling menarik - algoritma pencampuran tekstur. Untuk kesederhanaan dan kejelasan medan kami akan terdiri dari pasir dan batu-batu besar.


gambar


Cara blending yang paling sederhana adalah mengalikan warna tekstur dengan opacity dan kemudian menjumlahkan hasilnya.


float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.rgb * a1 + texture2.rgb * a2; } 

Teknik seperti itu digunakan di Unity3D di editor terrain standar. Seperti yang Anda lihat, transisinya mulus tetapi tidak alami. Batu terlihat kotor oleh pasir, tetapi di dunia nyata itu tidak terjadi seperti itu. Pasir tidak menempel pada batu, melainkan jatuh dan mengisi celah-celah di antara mereka, meninggalkan puncak-puncak batu yang murni.


Mari kita coba mensimulasikan perilaku ini di plot Excel. Karena kita ingin pasir "jatuh" di antara batu-batu bulat, untuk setiap tekstur kita membutuhkan peta kedalaman. Dalam contoh ini kami menganggap peta kedalaman dihasilkan dari gambar yang di-grayscaled dan disimpan dalam saluran alpha dari suatu tekstur. Di Unity3D dapat dilakukan di inspektur tekstur dengan mengatur bendera "Alpha From Grayscale".


Pertama-tama kita akan mempertimbangkan model peta kedalaman pasir dan batu yang disederhanakan.


gambar


Garis biru pada plot melambangkan peta kedalaman pasir dan merah adalah batu-batu bulat. Perhatikan bahwa puncak batu terletak lebih tinggi dari permukaan pasir. Mempertimbangkan fakta ini, kami akan mencoba menggambar piksel dari tekstur yang ada di atas.


 float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.a > texture2.a ? texture1.rgb : texture2.rgb; } 

gambar


Luar biasa! Bagian atas batu-batu bulat tetap murni sedangkan pasir terletak di celah-celah di antara mereka. Tapi kami belum mempertimbangkan opacity layer. Untuk menggunakannya, kami hanya menjumlahkan peta kedalaman kedalaman dan peta opacity.


 float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.a + a1 > texture2.a + a2 ? texture1.rgb : texture2.rgb; } 

Dengan mengorbankan penjumlahan, tekstur yang kurang transparan akan lebih tinggi dari biasanya.


gambar


gambar


Jadi kita memiliki transisi yang lebih alami dari pasir ke batu. Seperti yang Anda lihat, butiran-butiran pasir mulai mengisi celah-celah di antara batu-batu bulat, secara bertahap menyembunyikannya. Tetapi ketika perhitungan terjadi pixel-by-pixel, artefak mulai muncul di perbatasan antara tekstur. Untuk mendapatkan hasil yang halus, kami akan mengambil beberapa piksel secara mendalam, bukan satu, dan menggabungkannya.


 float3 blend(float4 texture1, float a1, float4 texture2, float a2) { float depth = 0.2; float ma = max(texture1.a + a1, texture2.a + a2) - depth; float b1 = max(texture1.a + a1 - ma, 0); float b2 = max(texture2.a + a2 - ma, 0); return (texture1.rgb * b1 + texture2.rgb * b2) / (b1 + b2); } 

Pada kode di atas kita pada awalnya mendapatkan bagian dari suatu tanah yang terlihat pada kedalaman tertentu.


gambar


Dan kemudian kita menormalkannya untuk mendapatkan opasitas baru.


gambar


gambar


Sebagai hasilnya, kami menemukan algoritma pencampuran tekstur, yang memungkinkan kami menjangkau dekat dengan gambar medan alami.

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


All Articles