Est-il important que j'apprenne OpenGL ou Direct3D?

11

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.

trichoplax
la source
2
La réponse de Ratchet Freak est bonne. Si vous voulez apprendre Direct3D, vous pouvez lire mon livre gratuit "The Direct3D Graphics Pipeline" . Les détails de l'API sont principalement Direct3D9, mais les concepts sont les mêmes. Le fait est que les concepts de programmation des graphismes 3D n'ont pas vraiment changé depuis la fin des années 1960. Les API pour exprimer ces concepts sont devenues beaucoup plus intelligentes.
légaliser

Réponses:

9

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.

Nero
la source
2
> "Si vous êtes assez bon pour écrire des programmes en Java par exemple, vous n'aurez pas beaucoup de mal à apprendre le C ++" - ce n'est pas vrai. Tout le monde aura des difficultés colossales à apprendre et à utiliser le C ++. La comparer à Java ou à tout autre langage sûr est totalement inapproprié. Pour les autres langages que vous avez répertoriés (Objective-C, Swift, ou un autre langage orienté objet), cette affirmation est surtout vraie.
Afficher le nom le
9

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.

monstre à cliquet
la source
6
Les nouvelles API graphiques explicites ne sont pas vraiment conçues pour être consommées par le programmeur graphique moyen, elles sont plutôt destinées aux personnes travaillant sur l'infrastructure dans les moteurs ou à ceux qui ont vraiment besoin de performances. Ils vous donnent un pistolet beaucoup plus gros et le pointent directement à votre pied.
porglezomp
3

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):

  • Quelles sont les textures et comment elles sont utilisées par le GPU.
  • Concepts de base du développement graphique (sommets, primitives, fragments, etc.)
  • Comment fonctionne le système de caméras (matrices MVP dans OpenGL par exemple).
  • Que sont les shaders et comment les utiliser correctement.
  • Différence entre un GPU et le CPU de votre machine.
  • Quelles sont les différences entre le modèle de mémoire du GPU et le modèle de mémoire du CPU.
  • Ce qui doit être fait sur le CPU et ce qui doit être déchargé sur le GPU pour le traitement.

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.

Sepehr
la source
Direct3D est également ce que vous utiliseriez si vous programmez pour l'une des consoles Xbox.
légaliser
Qu'entendez-vous par «rien de faisable»? Wine exécute sans problème des centaines de programmes basés sur D3D, et ce depuis des années. Bien sûr, il y a des bogues et des parties non implémentées, mais cela ne rend pas toute l'API inutilisable.
Ruslan
0

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.

Andreas
la source
D'après mon expérience, l'utilisation d'une carte graphique intégrée devrait être suffisante pour la plupart des développements OpenGL sous Windows, assurez-vous simplement qu'elle prend en charge une version OpenGL récente.
akaltar