Shader kaca bias

10

Saya memiliki lantai heksagonal tak terbatas, yang dihasilkan oleh tessellating titik grid dalam pasangan shader tessellation:

masukkan deskripsi gambar di sini

Perhatikan bahwa ini adalah bingkai gambar datar - "bayangan" adalah trik pencahayaan:

masukkan deskripsi gambar di sini

Sekarang, saya ingin membuat ini tampak seperti kaca yang tebal, bias, tetapi tidak yakin bagaimana untuk melanjutkan.

Hal pertama yang terlintas dalam pikiran adalah

  1. atur seragam yang berisi "ketebalan" balok yang diminta
  2. Saat menghitung pencahayaan, gunakan hukum Snell untuk menghitung panjang jalur optik, sebuah sinar akan melewati blok hex, jika itu benar-benar setebal yang dikatakan oleh "ketebalan" seragam, dan jumlah alpha di atas panjang itu. Itu akan memberikan transparansi, tetapi tidak menangani hal-hal seperti refleksi internal / TIR, dll.

masukkan deskripsi gambar di sini

Saya belum mencobanya, jadi saya tidak yakin apa hasil visualnya.

Pada akhirnya, untuk level khusus ini, saya mencoba untuk mendapatkan tampilan lantai heksagonal kaca yang digunakan di Tron: Legacy selama pertempuran disc. ( Lihat gambar ini sebagai contoh .)

Saran?

3Dave
sumber
1
Bisakah Anda menjelaskan lebih lanjut apa yang ingin Anda capai? Tembakan Tron kebanyakan menunjukkan pantulan, AFAICT, bukan pembiasan - Anda tidak dapat benar-benar melihat menembus pelat lantai di sebagian besar bidikan. Dengan asumsi Anda tidak hanya menginginkan permukaan yang mengkilap, apa yang ingin Anda lihat melalui lantai? Apakah ada tekstur subfloor yang ingin Anda tampilkan? Apakah ada seluruh adegan di bawah lantai (seperti di Tron)? Atau Anda ingin lebih seperti kaca buram di mana Anda tidak dapat melihat gambar yang berbeda, tetapi memiliki efek hamburan di bawah permukaan?
Nathan Reed
Hamburan di bawah permukaan, meskipun aku tidak tahu itu namanya. Membuat Googling lebih mudah. :)
3Dave

Jawaban:

4

Artikel dalam Permata GPU ini membahas secara mendalam tentang pembiasan, yang dapat memberikan hasil yang cukup bagus

(a) Transparansi lengkap (b) Kaca bias

Dalam arti paling mendasar

Langkah pertama dari teknik refraksi dasar adalah membuat geometri adegan menjadi tekstur, melompati semua jerat refraktif. Tekstur ini dapat digunakan untuk menentukan objek mana yang terlihat di belakang objek bias yang akan diberikan pada lintasan berikutnya. Kami menyatakan tekstur ini sebagai S.

Langkah kedua adalah membuat jerat bias, mencari nilai dari tekstur S dengan gangguan yang diterapkan untuk mensimulasikan tampilan bias. Gangguan dapat dicapai dengan menggunakan peta N normal, di mana komponen peta-normal merah dan hijau (XY) digunakan dan diskalakan dengan beberapa nilai kecil untuk menambahkan perpindahan ke dalam koordinat tekstur yang diproyeksikan. Pendekatan ini mudah diimplementasikan dalam shader:

  1. ambil tekstur N
  2. gunakan komponen XY yang diskalakan dengan nilai kecil (seperti 0,05)
  3. tambahkan nilai perpindahan ini ke koordinat tekstur yang diproyeksikan untuk S

Daftar berikut menunjukkan shader yang menunjukkan pendekatan ini

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

Gambar selanjutnya menggambarkan tiga langkah ini

Tiga langkah yang tercantum dalam shader di atas

Ada teknik yang lebih maju dalam artikel yang sama yang dapat mencapai tampilan yang jauh lebih menarik


Untuk efek serupa di Unity, Anda mungkin ingin melihat halaman wiki The Refraction Shader

codemonkey
sumber
3

Saya akan mengambil gambar yang Anda tunjukkan sebagai referensi untuk bagaimana saya membayangkan efeknya. Algoritma yang dapat saya pikirkan adalah sederhana:

  1. Jadikan lingkungan menjadi inorder tekstur kubus peta untuk mensimulasikan refleksi lingkungan.
  2. Terapkan tekstur peta kubus ke dalam bidang yang mewakili lapisan di bawah lantai bias. Jangan membuat pesawat lagi.
  3. Jadikan bidang menjadi tekstur, tekstur 2D normal.
  4. Serahkan tekstur ke shader refraktif yang digunakan untuk membuat lantai bias.
  5. Sekarang render jerat / lantai refraksi dengan shader.

Mengenai shader refraksi, inorder untuk mensimulasikan kaca yang bisa Anda lakukan

  • Gunakan istilah fresnel untuk mensimulasikan refleksi dan refraksi.
  • Gunakan peta normal / normal untuk melakukan pengambilan tekstur.

Saya hanya memikirkan ide itu, jadi saya tidak mengujinya. Saya yakin ini membutuhkan lebih banyak pekerjaan, Mungkin saya akan melakukannya begitu saya kembali dari pekerjaan.

concept3d
sumber
Pendekatan yang menarik - saya harus merebus yang itu sebentar. Terima kasih atas masukannya.
3Dave