Les deux API graphiques (OpenGL et DirectX) conçoivent un pipeline bien défini dans lequel plusieurs étapes sont programmables. Ces étapes programmables nécessitent de prendre une quantité minimale fixe de données et sont censées effectuer une gamme bien définie d'opérations sur celle-ci, et produire une sortie minimale définie, afin que les données puissent être transmises correctement à l'étape suivante. Il semble que ces pipelines soient conçus pour fonctionner avec une quantité limitée de types de données géométriques, qui dans le cas de D3D et OGL sont des données de sommet et des coordonnées de texture.
Mais, si on me donne un cas où l'application que je prévois de faire n'utilise pas de sommets (ou même de voxels) pour représenter ses données géométriques et ne fait pas exactement de transformations ou de projections ou de pixellisation ou d'interpolation ou quelque chose comme ça, de telles limitations des API ou le pipeline rend les choses difficiles.
Alors, existe-t-il un moyen de modifier le pipeline graphique de manière à ce que la fonctionnalité de ce que chaque étape fait aux données et le type de données qui sont produites à chaque étape soient modifiées à mon avantage? Sinon, existe-t-il un moyen par lequel je peux utiliser les fonctions API «brutes» pour construire mon propre pipeline? Sinon, veuillez indiquer pourquoi ce n'est pas possible.
EDIT : Mon application utilise des fonctions de densité pour représenter la géométrie. La fonction a une valeur à chaque point de l'espace. Je divise le tronc de l'appareil photo en une grille 3D, chaque bloc peut être projeté en pixel. Sur chaque bloc, j'intègre la fonction densité et vérifie si sa valeur est supérieure à une valeur requise. Si oui, alors il est supposé que quelque chose existe dans ce bloc et que le pixel correspondant à ce bloc est rendu. donc, maintenant dans mon moteur de rendu, je veux passer la fonction (que je représente avec une chaîne) au matériel graphique au lieu des données de sommet dans les tampons de sommet. cela implique également que le vertex shader n'aura pas de vertices à transformer en espace de clip homogeniouse et le fragment shader n'obtient pas d'informations sur les pixels. à la place, la plupart des recherches et évaluations se font désormais par pixel.
Réponses:
Vous pouvez absolument utiliser le GPU pour restituer des données volumétriques.
Puisque vous souhaitez évaluer un ensemble de fonctions par pixel sur l'écran, une approche simple consiste à rendre un triangle plein écran. Ce n'est qu'un seul triangle qui couvre tout l'écran (en fait, il couvre plus que l'écran, car l'écran n'est pas triangulaire, mais les parties hors écran sont rejetées par le GPU). Vous pouvez ensuite utiliser le pixel shader (qui reçoit les coordonnées d'écran du pixel qu'il ombrage) pour construire un rayon à travers votre volume, évaluer les fonctions, tout ce que vous devez faire.
(Contrairement aux autres réponses, je ne recommande pas un shader de calcul car il semble que vous souhaitiez effectuer des opérations par pixel, et un shader triangle + pixel plein écran est généralement plus efficace pour cela qu'un shader de calcul, bien que les shaders de calcul fonctionneront certainement aussi.)
La méthode du triangle plein écran est très courante dans les graphiques en temps réel pour les opérations de post-traitement, vous pouvez donc probablement y trouver toutes les informations dont vous avez besoin avec un peu de recherche.
BTW, il peut vous intéresser de lire Rendering Worlds with Two Triangles par Iñigo Quílez, un exposé qui décrit comment rendre des scènes 3D composées à l'aide de fonctions mathématiques (en particulier, les champs de distance) en utilisant la technique de pixel shader plein écran.
la source
Le traçage de rayons et d'autres techniques sont couramment effectués avec Compute Shaders, pris en charge par Direct3D depuis la sortie de D3D11 et OpenGL depuis 4.3 (et plus via l'utilisation d'OpenCL et de certaines contorsions).
la source
Il semble que vous souhaitiez utiliser un shader de calcul GPU ou utiliser un objet "Shader Storage Buffer" pour aider à étendre le pipeline en fonction de vos besoins. Les mathématiciens, les scientifiques et d'autres personnes qui se tournent vers le GPU pour calculer des choses qui ne se traduisent pas exactement en graphiques standard utilisent ce genre de chose.
http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders
Si cela ne vous oriente pas dans la bonne direction, cela vous dérangerait-il d'étendre le concept de la vôtre qui ne correspond pas au paradigme sommet / fragment?
la source