Les différences entre ces deux API sont-elles des détails d'implémentation mineurs qui signifient qu'une fois que j'en ai appris une, je peux l'utiliser pour tout? Ou y a-t-il des raisons d'apprendre l'un plutôt que l'autre si je veux pouvoir l'utiliser en général sans avoir à réapprendre une autre API à l'avenir? L'un ou l'autre est-il plus général?
En particulier, j'aimerais pouvoir écrire pour n'importe quelle carte graphique, donc le code n'est pas limité à ne fonctionner que sur les cartes d'un fabricant particulier ou sur un modèle spécifique. J'aimerais aussi pouvoir écrire du code qui fonctionne toujours en l'absence de carte graphique (quoique plus lent).
Y a-t-il une différence dans la façon dont le code portable sera sur différentes plates-formes (systèmes d'exploitation / architectures)? Je m'intéresse à la disponibilité d'autres bibliothèques qui fonctionnent avec celles-ci, et si l'une ou l'autre conduit à moins de restrictions de licence dans son environnement plus large. Tout ce qui est mesurable ferait une différence pour savoir si l'un d'eux pourrait être le seul que j'apprenne sans me restreindre.
Réponses:
Je ne pense pas que cela importe beaucoup, quelle API vous souhaitez utiliser lorsque vous vous penchez sur "programme graphique". Les choses les plus importantes à apprendre sont les concepts typiques que vous utilisez lorsque vous travaillez avec des scènes 3D. Par exemple, vous voulez apprendre à écrire un graphe de scène simple (puis plus sophistiqué). Ces concepts sont beaucoup plus importants que les noms de méthode API spécifiques que vous devez appeler.
Comparez-le lorsque vous apprenez à écrire des programmes. Si vous êtes assez bon pour écrire des programmes en Java par exemple, vous n'aurez pas beaucoup de mal à apprendre C ++, Objective-C, Swift ou un autre langage orienté objet. Parce que ce sont les concepts et la pensée que vous apprenez.
Le choix entre OpenGL, Direct3D et Metal est principalement le choix, quel système d'exploitation vous ciblez. Direct3D est principalement disponible sur Windows, Metal sur OS X et iOS, et OpenGL est pris en charge sur la plupart des systèmes, y compris OS X, iOS, Windows et Linux.
La carte graphique a probablement peu ou pas d'influence sur cette décision car je ne connais pas de carte qui n'en prend en charge qu'une ou deux. Si vous n'avez pas de carte graphique dédiée, le rendu en temps réel sera bientôt un problème. Bien qu'un Intel HD Graphics et le compagnon AMD puissent déjà faire beaucoup.
Alors, choisissez votre plateforme.
Avertissement: Pour l'instant, je n'ai utilisé ni Direct3D ni Metal.
la source
Nous sommes actuellement dans une transition de paradigmes API.
La méthode old school de lier les tampons, les uniformes, les attributs, la mise en page et les programmes en tant qu'état global (implicite) et de répartir les tirages avec cet état est courante dans D3D11 et OpenGL. Cependant, il a une grande quantité de frais généraux (en vérifiant l'état et en ne sachant pas ce que le programme veut faire jusqu'à la dernière minute). Ils ne sont pas non plus thread-safe (pour la plupart).
C'est pourquoi de nouveaux apis sont apparus (ou arriveront bientôt) D3D12, vulkan et Metal étant les plus importants. Ces API donnent plus de contrôle au programme et lui permettent de déclarer à l'avance ce qu'il veut faire en utilisant des tampons de commande. Ils vous permettent également de gérer vos propres ressources (données de vertex, textures, ...) beaucoup plus directement. Les utiliser avec plusieurs est beaucoup plus simple.
Le choix entre l'ancien et le nouveau est basé sur la façon dont vous pouvez gérer la mémoire vidéo que vous allouez et créer le tampon de commande.
Si vous voulez quelque chose qui "fonctionne" même sur du matériel plus ancien, alors les API old school sont meilleures; ils sont également mieux connus et vous obtiendrez plus d'aide sur eux en ligne.
D'un autre côté, si vous pouvez gérer la nature asynchrone des commandes de répartition et que cela ne vous dérange pas d'avoir à suivre tous les tampons que vous allouez. Les nouvelles API pourraient alors vous convenir.
la source
Personnellement, je ne pense pas que cela compte beaucoup. Choisissez-en un qui convient à votre projet. J'ai utilisé D3D et OpenGL dans le passé. Ce sont les concepts qui comptent. Quoi que vous saisissiez, vous devez comprendre (par exemple):
Comme d'autres l'ont mentionné ici, nous sommes au milieu d'une transition vers un nouvel ensemble d'API (Vulkan, Metal, etc.) donc à ce stade, si vous êtes complètement nouveau dans le développement graphique, se concentrer probablement sur GLSL est une bonne idée depuis Vulkan va également en profiter.
En ce qui concerne la portabilité, D3D est uniquement Windows (il y a des rumeurs selon lesquelles le projet Wine essaie de faire fonctionner D3D sous Linux mais rien n'est faisable jusqu'à présent). OpenGL est multiplateforme. Si vous voulez devenir mobile, OpenGL ES est une option disponible. Bien sûr, OpenGL et OpenGL ES ont des versions différentes qui ne sont pas prises en charge par toutes les plateformes.
Au bout du compte, toutes les API accèdent au même matériel sur votre machine, c'est juste une question de "comment" elles y accèdent.
la source
Je vais dire quelques mots sur le rendu sans carte graphique.
Niether OpenGL ni DirectX n'ont vraiment besoin d'une carte graphique. Une implémentation peut être entièrement accélérée par logiciel.
Pour OpenGL sous Linux, il existe un rasterizer logiciel Mesa. D'après mon expérience, cela fonctionne bien tant que vous ne poussez pas trop fort en combinant des fonctionnalités étranges (liste d'affichage + tableaux de vertex indexés). J'imagine que leur liste de bugs réels est très élevée. Assurez-vous de faire des tests continus!
J'ai moins d'expérience avec OpenGL sous Windows. Modifiez la réponse si vous savez quelque chose!
Le SDK DirectX est fourni avec un logiciel de tramage appelé "tramage de référence". C'est principalement pour le débogage à mon avis, mais je connais au moins un ami utilisant le rasterizer de référence lors du développement de DX11 sur un ordinateur portable compatible DX10 uniquement. Comme mentionné dans d'autres réponses, DirectX est uniquement Microsoft.
la source