Для фактичної математики викривлення це може стати дуже складним, чому б вам не почати тут? .
Зараз я розповім про те, як ви можете це застосувати, припускаючи, що ви вже отримали математику щодо того, як ви будете знижувати свої деформації.
2 способи:
1) Кожен кадр, відвідуйте кожну вершину в моделі циліндра і певним чином її зміщуйте.
2) Зміщення вершин у вершинній шейдері під час візуалізації. OpenGL ES 2.0 підтримує вершинні шейдери. Значить, вам пощастило, певним чином.
Ви хочете, щоб викривити об'єкт лише так, як він з'являється на екрані , або ви хочете викривити об'єкт, щоб кожен предмет у грі знав, що він деформований?
Якщо ви обмотуєте об'єкт у вершинній шейдері, це відбувається лише безпосередньо перед показом / растерізацією , тому це означає, що жоден з ігрових об’єктів не знатиме про деформацію . Це добре, якщо ви просто робите заставку або якщо деформації настільки малі, що не впливають на форму предмета, що стикається.
Коли ви перекручуєте геометрію у вершинній шейдері, оригінальні вершини моделі насправді не рухаються (вони, як видається, рухаються ).
Деформація у вершинній шейдері
Неоформлений:
Деформований
Це з розділу 6 підручника cg , (програма №14).
Код шейдера для отримання цієї деформації є чимось подібним
// 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) ;
Отже, ви можете бачити, що це трапляється ПРАВО ДО ПЕРЕД дисплея (вершинний шейдер трапляється на GPU), тому код CPU практично не має можливості отримати доступ до перетвореної вершинної позиції (є способи надсилання даних з GPU до процесора (насамперед за допомогою текстур), але ми не піду туди).