Untuk matematika sebenarnya dari warping, ini bisa menjadi sangat rumit, mengapa Anda tidak mulai dari sini? .
Sekarang saya akan berbicara tentang bagaimana Anda dapat menerapkan ini, dengan asumsi Anda sudah mendapatkan matematika untuk bagaimana Anda akan melakukan deformasi.
2 cara:
1) Setiap frame, kunjungi setiap titik dalam model silinder dan offset dengan beberapa cara.
2) Mengimbangi simpul dalam shader vertex saat Anda merender. OpenGL ES 2.0 mendukung vertex shaders. Jadi, Anda beruntung.
Apakah Anda ingin hanya membengkokkan objek seperti yang muncul di layar , atau Anda ingin membengkokkan objek sehingga setiap objek dalam permainan tahu bahwa itu telah cacat?
Jika Anda membengkokkan objek dalam vertex shader, maka itu terjadi hanya sesaat sebelum tampilan / rasterisasi , jadi ini berarti tidak ada objek game yang akan tahu tentang deformasi . Ini bagus jika Anda hanya membuat screen saver, atau jika deformasi sangat kecil sehingga tidak berdampak pada bentuk objek yang dapat di collidable.
Ketika Anda membelokkan geometri dalam vertex shader , simpul asli dari model sebenarnya tidak bergerak , (mereka hanya tampak bergerak ).
Deformasi pada vertex shader
Tidak diketahui:
Cacat
Ini dari bab 6 tutorial cg , (program # 14).
Kode shader untuk menghasilkan deformasi ini adalah sesuatu seperti
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
Jadi Anda dapat melihat, ini terjadi KANAN SEBELUM tampilan (vertex shader terjadi pada GPU) sehingga kode CPU praktis tidak memiliki cara untuk mengakses posisi vertex yang diubah (ada cara untuk mengirim data dari GPU ke CPU (terutama melalui tekstur) tetapi kami tidak akan pergi ke sana).