Für die eigentliche Mathematik des Warpens kann dies sehr kompliziert werden. Warum fängst du nicht hier an? .
Ich werde jetzt darüber sprechen, wie Sie dies anwenden können, vorausgesetzt, Sie haben bereits die Mathematik, wie Sie Ihre Verformungen nach unten machen werden.
2 Wege:
1) Besuchen Sie bei jedem Frame jeden Scheitelpunkt im Zylindermodell und versetzen Sie ihn auf irgendeine Weise.
2) Versetzen Sie die Scheitelpunkte im Scheitelpunkt-Shader beim Rendern. OpenGL ES 2.0 unterstützt Vertex-Shader. In gewisser Weise haben Sie Glück.
Möchten Sie das Objekt nur so verziehen, wie es auf dem Bildschirm angezeigt wird , oder möchten Sie das Objekt verziehen, damit jedes Objekt im Spiel weiß, dass es deformiert wurde?
Wenn Sie das Objekt im Vertex-Shader verziehen , geschieht dies erst unmittelbar vor der Anzeige / Rasterung . Dies bedeutet, dass keines der Spielobjekte von der Verformung weiß . Dies ist in Ordnung, wenn Sie lediglich einen Bildschirmschoner erstellen oder wenn die Verformungen so gering sind, dass sie keinen Einfluss auf die kollidierbare Form des Objekts haben.
Wenn Sie die Geometrie im Scheitelpunkt-Shader verziehen, bewegen sich die ursprünglichen Scheitelpunkte des Modells tatsächlich nicht (sie scheinen sich nur zu bewegen ).
Verformung im Vertex-Shader
Undeformiert:
Deformiert
Dies ist aus Kapitel 6 des CG-Tutorials (Programm Nr. 14).
Der Shader-Code, der diese Verformung erzeugt, ist ungefähr so
// 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) ;
Sie können also sehen, dass dies direkt vor der Anzeige geschieht (Vertex-Shader erfolgt auf der GPU), sodass der CPU-Code praktisch keine Möglichkeit hat, auf die transformierte Vertex-Position zuzugreifen (es gibt Möglichkeiten, Daten von der GPU an die CPU zu senden (hauptsächlich über Texturen), aber wir werde nicht dorthin gehen).