Library : directX 9,
development tools : VS2003
Tujuan : Awan ini akan digunakan dalam lingkungan virtual “shooting simulator” sebagai background langit.
Teknik ini diimplementasikan oleh john isidoro dan guennadi riguer menggunakan pixel shader, keduanya adalah peneliti di ATi
Salah satu hal yang bisa dilakukan dengan menggunakan “texture perturbation” adalah membuat awan. Ide dasarnya adalah dengan men-scroll dua buah texture melewati satu sama lainnya dalam arah yang berlawanan. Texture pertama adalah “perturbation texture” yang memiliki perturbasi dalam arah vektor u dan v disimpan dalam channel merah dan hijau. Texture kedua adalah “cloud texture” yang kordinat texturenya di perturbasi menggunakan “perturbation map”. Untuk seksi ini kita menggunakan cloud dengan tekstur grayscale yang kemudian di packing pada alpha channel pada “perturbation map”. Untuk packing ini hanyasatu buah tekstur yang dibutuhkan untuk masing masing lapisan awan. Tekstur ini di load dua kali di dalam shader, yang pertama untuk memperoleh nilai perturbasi yang kedua untuk membaca tekstur perturbasi.
ps.1.4
texld r0, t0
texcrd r1.rgb, t1
mad r0, r0, c0, r1 //multiply perturbation by scale factor, and add texcoords
phase
texld r0,r0
mov r0, r0
Untuk membuat awan yang ada menjadi lebih realistis disarankan untuk menggunakan beberapa layer awan. Layer – layer ini dapat dikombinasikan dengan menggunakan beberapa cara. Salah satu cara untuk menggabungkan layer – layer ini ialah dengan menginterpolasi mereka secara linear didalam pixel shader. Layer – layer awan tersebut kemudian di scroll melewati satu sama lain dengan kecepatan yang berbeda untuk memberikan efek paralaks.
Untuk memberikan warna pada awan “color gradient” dari suatu grayscale tekstur map kita dapat menggunakan operasi perkalian dengan faktor 2 dan kemudian di saturasi. Pada contoh ini warna yang dimodulasi didalam awan adalah orange (RGB: 1.0,0.7,0.5). Gradient yang dihasilkan bervariasi dari coklat, oranye, kuning dan putih.
Code:
// SetPixelShaderConstant 0 psConstVec (0.0, 0.5, 1.0, 0.75)
// SetPixelShaderConstant 1 cloud0PerturbationFactor
// SetPixelShaderConstant 2 cloud0Color
// SetPixelShaderConstant 3 cloud1PerturbationFactor
// SetPixelShaderConstant 4 cloud1Color
ps.1.4
texld r0, t1 //perturbation map 0
texld r1, t3 //perturbation map 1
texcrd r2.rgb, t0 //cloud layer 0 tex coord
texcrd r3.rgb, t2 //cloud layer 1 tex coord
mad r0.rgb, c1, r0_bx2, r2 //perturb base map coords by cloud coords
mad r1.rgb, c3, r1_bx2, r3 //perturb base map coords by cloud coords
phase
texld r0, r0
texld r1, r1
texld r2, t4
mul_x2_sat r4.rgb, r0.a, c2 //cloud layer 0, multiply by color
+mul r4.a, r0.a, c2.a //cloud layer 0, alpha scale
mul_x2_sat r3.rgb, r1.a, c4 //cloud layer 1, multiply by color
+mul r3.a, r1.a, c4.a //cloud layer 1, alpha scale
lrp r0.rgb, r1.a, r3, r4 //interpolate between layers 0 and 1
+add_sat r0.a, r3.a, r4.a //add transparency values for layer
lrp_sat r0, r0.a, r0, r2 //interpolate between clouds and horizon
==================================================
Beberapa bulan kemudian ...
Melihat waktu yang tersisa, lebih realistis menggunakan SkyBox. Dan memang ujung-ujungnya menggunakan SkyBox. (-_-)'
No comments:
Post a Comment