Selasa, 24 Maret 2020

Membuat Bayangan Blok di Minecraft Pocket Edition (PE)

Halo teman-teman,
 Selamat datang di blog PioDiamond.

Bayangan Blok
 Kali ini, kita akan membahas bagaimana membuat bayangan blok seperti gambar di atas. Kita akan menggunakan variable uv1 yang ada pada Minecraft PE. Nah, uv1 ini bertipe vec2 yang artinya ada nilai x dan y. Nilai x adalah detektor cahaya seperti torch, sea lantern, api, dll. Sedangkan nilai y adalah detektor bayangan seperti di dalam air, dalam goa, di bawah pohon, dll.


  Memang sebenarnya minecraft sudah punya bayangan blok dari shader originalnya, hanya saja kurang terlihat di bawah pohon dan hanya terlihat jika sudah memasuki goa. Jadi kita akan memperkecil nilai uv1.y dengan menggunakan tambahan kode.

  Langsung saja kita mulai. Jika teman-teman belum memiliki shader original minecraft, silakan download di sini. Kemudian, ekstrak ke Internal Storage > games > com.mojang > resource_packs. Setelah di ekstrak, silakan buka file renderchunk.fragment di folder Internal Storage > games > com.mojang > resource_packs > vanilla > shaders > glsl menggunakan text editor.

   Nah, cari teks #ifdef FOG. Di atasnya, kita buat kode baru.
float bayangan = clamp(( uv1.y - 0.8 ) * 5.0, 0.45, 1.0 );
diffuse.rgb *= mix( bayangan, 1.0, uv1.x );
Kode yang telah di tulis ke renderchunk.fragment
  Setelah dibuat, silakan disimpan dan pasang shader yang telah diedit di Global Resource.

Untuk penjelasannya :
  Fungsi clamp sama dengan rumus min( max(( uv1.y - 0.8 ) * 5.0, 0.45 ), 1.0 ); dimana fungsi min( x, y ) untuk menghasilkan nilai terkecil dari x dan y sedangkan max( x, y ) adalah kebalikannya.
  Fungsi mix( x, y, z ); merupakan pengambilan nilai diantara nilai x dan y, tergantung dari nilai z. Jika nilai z bernilai 0, maka nilai keluaran dari fungsi mix adalah nilai x. sedangkan jika nilai z bernilai 1, maka nilai keluarnya adalah y. dan jika nilainya z adalah 0.5, maka nilai keluarnya adalah nilai tengah dari nilai x dan nilai y.
  diffuse.rgb merupakan variable warna blok dari shader originalnya.

  Sebenarnya ada banyak model dari pembuatan bayangan blok. Kalian bisa tonton video saya di youtube, hanya saja karena ketika itu saya masih baru mengenal dunia shader, jadi tidak saya sarankan untuk menggunakan kode yang ada di video tersebut.
  Dan mungkin itu saja yang bisa saya bahas di postingan kali ini. Silakan subscribe channel saya di sini untuk mendapatkan tutorial lainnya.

Note:
  Mohon agar teliti saat menulis kode, karena salah pada besar dan kecil huruf dapat menyebabkan world transparan.

27 komentar:

  1. Kok Yg Gelap Malah Dunia Nya Bang :v

    BalasHapus
    Balasan
    1. Eh iya, wkwk. udah di update dan udah di tes. yang ini gak salah lagi.

      Hapus
  2. :v rumus shader lebih susah dari pada rumus MTK

    BalasHapus
  3. Bang yg gelap kok dunianya?

    BalasHapus
  4. Bang gimana cara cerahkan daunya?

    BalasHapus
    Balasan
    1. caranya adalah

      if( color.g > color.r ) {
      diffuse.g += vec3( 0.2 );
      }

      yagitu aja sih biar airnya ga kena warnya kalo warnanya airnya juga ikut saya juga tidak tau saya masih belajar tentang "color" jadi ya maaf kalo ngebug

      Cek channel Farell Gaming YT saya merilis shaders saya tapi masih sedikit soalnya masih baru hehe...

      Hapus
  5. Bang daripada kaya gitu, mending pake smoothstep aja
    Misal
    float shadow = smoothstep(0.876,0.869,uv1.y);
    shadow *= (1.-uv1.x);
    float gelap = 0.7;
    shadow = mix(0.,gelap,shadow);
    diffuse.rgb = mix(diffuse.rgb,vec3(0),shadow);
    agak panjang tapi shadownya bakal smooth

    BalasHapus
    Balasan
    1. gimana bang solusinya kalo block slab gaada bayangannya

      Hapus
    2. if(((uv1.y<shdY-0.0010)||(shdX<0.64))&&fog_flag==0.0){
      diffuse.rgb *= Shadow_Color;
      }
      if(((uv1.y<shdY-0.0020)||(shdX<0.63))&&fog_flag==0.0){
      diffuse.rgb *= Shadow_Color;
      }
      if(((uv1.y<shdY-0.0030)||(shdX<0.62))&&fog_flag==0.0){
      diffuse.rgb *= Shadow_Color;
      }
      if(((uv1.y<shdY-0.0040)||(shdX<0.61))&&fog_flag==0.0){
      diffuse.rgb *= Shadow_Color;
      }

      Taronya Kodenya Sama kayak yang diatas :v

      Hapus
  6. Tolong tunjukkin tutorial buat lens flare dong,bang

    BalasHapus
  7. Bang warna daunnya kok jadi gelap

    BalasHapus
  8. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  9. Di mcpe versi alpha color.a masih berfungsi. jadi,uv1.y bisa diubah ke color.a.Tapi di mcpe versi beta Mojang telah mengubah color.a menjadi color.g.

    BalasHapus
  10. Bang, clamp gak terlalu sama kaya min(max()), soalnya kalo maxnya(0.45) maka codenya akan dibatasi sekaligus di tambah dari 0.45

    BalasHapus
  11. bang kalo boleh tau code editornya apa ya? hehe

    BalasHapus
  12. Bang solusi buat block slab gaada bayangannya gimana ya? sama barangkali kalo tau cara ngasih player shadow, terimakasih

    BalasHapus
  13. Bang,Kalau pake shaders selain vanilla, bisa kan?

    BalasHapus