Je verwart hier frameworks en engines. OpenCL is namelijk helemaal geen concurrent voor OpenCL: Cuda is dat wel.
OpenCL en Cuda zijn algemene frameworks om berekeningen makkelijk te offloaden naar een GPU. Cuda werkt enkel op een nVidia GPU, terwijl OpenCL op zowat alles werkt indien de fabrikant ondersteuning heeft voorzien. Het immense voordeel van OpenCL is dat het zelfs werkt wanneer je geen/geen ondersteunde GPU hebt: OpenCL-calls kunnen zowel op GPU als op CPU worden uitgevoerd.
PhysX daarentegen is een engine voor effecten gerelateerd met fysica. De fetureset wordt telkens uitgebreid: eerst ging het voornamelijk om gedrag van kleine voorwerpen (het stuiteren van een bal of vele brokstukken), dat werd vij snel uitgebreid met het gedrag van stoffen en hoe die scheuren en brekend glas, later werd ook het gedrag van rook en vloeistoffen toegevoegd, en nu werken ze blijkbaar aan vacht. Ik vermoed dat de volgende stap zal zijn in de richting van vochtige vacht en stof.
Het verschil tussen een engine zoals PhysiX en een framework zoals Cuda/OpenCL is dat ze gewoon een ander probleem oplossen, ze zijn van een ander niveau:
- OpenCL en Cuda gebruik je als je een groot aantal bewerkingen wilt doen, zoals een immens grote loop van optellingen/vermenigvuldigingen, of een matrixvermenigvuldiging (hiervoor gebruik je eigenlijk best BLAS, maar ik dwaal af). Dat soort bewerkingen kan op verschillende manieren versneld worden: door gebruik van SSE of AVX instructies (versnellen op 1 CPU-core), door multithreaden (versnellen op meerdere CPU-cores), of door de GPU in te schakelen (GPGPU). De eerste optie kun je de compiler laten doen met minieme aanpassingen aan de code. De tweede optie kun je doen door je code multithreaded te herschrijven. De derde optie is vrij moeilijk, maar Cuda maakt dit een stukje makkelijker.
Echter, welke van de drie opties het beste is, hangt af van je machine (welke instructies worden ondersteund door je CPU, hoeveel cores heb je, welke GU heb je?), de developer meot dus ofwel voor en optie kiezen die niet voor iedereen optimaal is, of zijn code drie keer schrijven en at runtime kiezen welke van de drie opties gedraaid wordt. Hier komt OpenCL van pas: OpenCL laat je toe 1 keer code te schrijven die op eender welke machine de meest efficiënte manier kiest om jouw parallelle bewerkingen uit te voeren.
- Bij Physix daarentegen is de developer niet echt geïnteresseerd in welke parallelle bewerkingen er gebeuren. Het probleem van de developer is: dit 3D model moet zich gedragen volgens een set parameters (zijn gewicht, zijn snelheid, de weerstand, de cohesie van een vloeistof, ...). Om dan het exacte gedrag te berekenen (de baan van een bewegend voorwerp/de manier waarop water loopt/manier waarop stof scheurt) moeten er dan wel een enorme boel parallelle berekeningen gebeuren - en op dat punten raken OpenCL en Physix dan wel - maar het kan de dev niet echt schelen welke berekeningen dat zijn. Physix bepaalt voor de dev welke berekeningen er moeten gebeuren om het gedrag te modelleren, en die berekeningen doet PhysX met CUDA.
De enige noemenswaardige concurrent van PhysiX is dan ook de Havok engine. Deze is namelijk wel hardware-onafhankelijk, maar heeft een pak minder features: voor zo ver ik weet draait Havok voornamelijk rond collision detection.
Ik heb het zelf niet echt voor platform-afhankelijke oplossingen zoals PhysiX en Cuda, het moet gezegd worden dat PhysX momenteel gewon de beste en meest uitgebreide physix engine op de markt is.
Mijn onmogelijke wens is dus neit dat PhysX verdwijnt, maar dat PhysX wordt geport naar OpenCL ipv CUDA.