Thursday, July 12, 2012

sistem partikel


Partikel Sistem
Aplikasi lain dari vertex shader adalah perhitungan perilaku sistem partikel pada GPU. Hal ini agak lebih kompleks karena assing parameter dapat unintuitive. Bayangkan ledakan, misalnya: Partikel terbang ke segala arah mengikuti garis lurus dari posisi pusat. Efek ini dapat dengan mudah dibangun menjadi sebuah shader vertex karena kita dapat menghitung posisi setiap partikel dari posisi valuespass awal, kecepatan, dan waktu berlalu dengan shader-dan akan mengurus sisanya. Persamaan akan
Pos = pos0 + vel0 * t
Kita dapat menggunakan filosofi yang sama untuk menghitung efek yang tergantung pada nilai awal saja: lulus nilai-nilai dan menggunakan shader sebagai pemecah persamaan. Sekarang, bayangkan bahwa kita memiliki sistem partikel agak lebih kompleks, dimana setiap frame memiliki tingkat ketidakpastian, sehingga setiap iterasi dihitung dari yang sebelumnya. Sebagai contoh, bayangkan sebuah kolom asap, yang dipengaruhi per frame dengan Noise Perlin, seperti ini:
pos.x = prevpos.x + kebisingan (x, y, z) * 0,01;
pos.y = prevpos.y 0,1;
pos.z = prevpos.z + Kebisingan (x, z, y) * 0,01;
Ini lebih sulit untuk meletakkan kode. Setiap iterasi shader recomputes posisi, yang kita akan perlu untuk memulihkan setelah diproses, sehingga kita dapat memberi makan ke iterasi berikutnya, dan seterusnya. Untuk saat ini, hal ini tidak mungkin, sehingga kita harus membatasi diri untuk shader berdasarkan kondisi awal saja. Berikut ini adalah, misalnya, kode sumber untuk shader yang menghitung posisi dan orientasi dari partikel yang berasal
dari posisi awal, dengan kecepatan tertentu:
kekosongan partikel (float4 posisi: POSISI,
float4 warna: WARNA,
float2 texcoord: TEXCOORD0,
float4 kecepatan: TEXCOORD1,
float4 initialpos: TEXCOORD2,
keluar float4 pertentangan: POSISI,
keluar float2 oTexCoord: TEXCOORD0,
keluar float3 oColor: WARNA,
seragam mengambang timevalue,
seragam float4x4 modelviewProj)
{
float4 newpos = initialpos + posisi + kecepatan * timevalue;
pertentangan = mul (modelviewProj, newpos);
oTexCoord = texCoord;
oColor = warna;
}
Kode ini mudah. Yang harus kita lakukan adalah memberi makan shader dengan koordinat partikel dalam bentuk ditampilkan dalam gambar, dan shader akan menerjemahkannya ke posisi awal dan menghidupkan mereka dengan waktu. Kami tidak berurusan dengan alignment kali ini karena sudah dijelaskan dalam contoh shader sebelumnya. Dengan menggabungkan keduanya, Anda akan mencapai hasil yang dikombinasikan cukup menarik (lihat Gambar 21.6).
Gambar 21.6. Partikel sistem menggunakan shader untuk simulasi dan PointSprites DirectX
sebagai rendering primitif. Partikel dicampur addictively.

No comments:

Post a Comment