Jeśli chodzi o rzeczywistą matematykę wypaczania, może to być bardzo skomplikowane, dlaczego nie zaczniesz tutaj? .
Teraz porozmawiam o tym, jak możesz to zastosować, zakładając, że masz już matematykę na temat tego, jak zmniejszysz swoje deformacje.
2 drogi:
1) Każdą ramkę odwiedzaj każdy wierzchołek w modelu walca i w pewien sposób przesuwaj.
2) Przesuwaj wierzchołki w module cieniującym wierzchołków podczas renderowania. OpenGL ES 2.0 obsługuje shadery wierzchołków. W pewnym sensie masz szczęście.
Czy chcesz tylko wypaczać obiekt, który pojawia się na ekranie , czy chcesz wypaczać obiekt, aby każdy obiekt w grze wiedział, że został zdeformowany?
Jeśli zniekształcisz obiekt w module cieniującym wierzchołki, nastąpi to tylko bezpośrednio przed wyświetleniem / rasteryzacją , co oznacza, że żaden z obiektów gry nie będzie wiedział o deformacji . Jest to w porządku, jeśli po prostu wygaszacz ekranu lub deformacje są tak małe, że nie mają wpływu na zderzalny kształt obiektu.
Kiedy zniekształcasz geometrię w module cieniującym wierzchołki, oryginalne wierzchołki modelu w rzeczywistości się nie poruszają ( wydają się tylko poruszać ).
Deformacja w module cieniującym wierzchołki
Nieformalne:
Zdeformowany
To jest z rozdziału 6 samouczka cg (program nr 14).
Kod modułu cieniującego do wytworzenia tego odkształcenia jest podobny
// 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) ;
Tak więc widać, że dzieje się to PRAWO PRZED wyświetleniem (moduł cieniujący wierzchołek dzieje się na GPU), więc kod procesora praktycznie nie ma dostępu do przekształconej pozycji wierzchołka (istnieją sposoby przesyłania danych z GPU do procesora (głównie poprzez tekstury), ale my nie pójdę tam).