Gerçek çarpıtma matematiği için bu çok karmaşık olabilir, neden buradan başlamıyorsunuz? .
Şimdi deformasyonlarınızı nasıl yapacağınız için zaten bir matematiğe sahip olduğunuzu varsayarak, bunu nasıl uygulayabileceğiniz hakkında konuşacağım.
2 yol:
1) Her çerçeve, silindir modelindeki her köşeyi ziyaret edin ve bir şekilde ofsetleyin.
2) Oluştururken köşe gölgeleyicisindeki köşeleri kaydırın. OpenGL ES 2.0 tepe gölgelendiricileri destekler. Yani bir şekilde şansın var.
Nesneyi yalnızca ekranda göründüğü gibi bükmek mi istiyorsunuz yoksa nesneyi, oyundaki her nesnenin deforme olduğunu bilmesi için bükmek mi istiyorsunuz?
Nesneyi köşe gölgelendiricisinde çarpıtırsanız, bu yalnızca görüntüleme / rasterleştirmeden hemen önce gerçekleşir , bu nedenle oyun nesnelerinin hiçbiri deformasyon hakkında bilgi sahibi olmayacağı anlamına gelir . Bu, sadece bir ekran koruyucu yapıyorsanız veya deformasyonlar nesnenin harmanlanabilir şekli üzerinde hiçbir etkisi olmayacak kadar küçükse iyidir.
Köşe gölgelendiricisindeki geometriyi çözdüğünüzde, modelin orijinal köşeleri aslında hareket etmez (sadece hareket ederler ).
Tepe gölgelendiricisinde deformasyon
deforme olmamış:
deforme olmuş
Bu, cg eğitiminin 6. bölümüdür (program # 14).
Bu deformasyonu üreten gölgelendirici kodu şuna benzer
// 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) ;
Gördüğünüz gibi, bu ekrandan ÖNCE gerçekleşir (köşe gölgelendirici GPU'da gerçekleşir), böylece CPU kodunun dönüştürülmüş köşe konumuna erişmenin neredeyse bir yolu yoktur (GPU'dan CPU'ya (öncelikle dokular aracılığıyla) veri göndermenin yolları vardır, ancak biz oraya gitmeyecek).