OpenGLを学ぶかDirect3Dを学ぶかは重要ですか?


11

これら2つのAPIの違いはマイナーな実装の詳細ですか?それは、一度学んだらすべてに使用できるということですか?または、将来的に別のAPIを再学習する必要なく一般的に使用できるようにしたい場合、どちらか一方を学習する理由はありますか?どちらか一般的ですか?

特に、どのグラフィックスカードでも書き込めるようにしたいので、コードは特定のメーカーのカードや特定のモデルでのみ実行されるように制限されていません。また、グラフィックスカードがなくても動作するコードは記述できるようになりたいと思っています(遅いですが)。

異なるプラットフォーム(オペレーティングシステム/アーキテクチャ)間で移植可能なコードがどのようになるかには違いがありますか?これらと連携する他のライブラリーが入手可能かどうか、そしてどちらか一方が広い環境でのライセンス制限を減らすかどうかに興味があります。これらの1つが私を制限することなく私が学ぶ唯一のものであるかどうかに違いをもたらす測定可能なもの。


2
ラチェットフリークの答えは良いものです。Direct3Dを学びたい場合は、私の無料の本「The Direct3D Graphics Pipeline」を読むことができます。APIの詳細はほとんどDirect3D9ですが、概念は同じです。問題は、3Dグラフィックスをプログラミングするための概念が1960年代後半以降まったく変更されていないことです。これらの概念を表現するためのAPIは、はるかに賢くなっています。
2015年

回答:


9

「グラフィックスのプログラミング」に傾くときにどのAPIを使用するかは、それほど重要ではないと思います。学ぶべきより重要なことは、3Dシーンを扱うときに使用する典型的な概念です。たとえば、単純な(そして後でより洗練された)シーングラフを作成する方法を学びたいとします。これらの概念は、呼び出す必要がある特定のAPIメソッド名よりもはるかに重要です。

プログラムの書き方を学ぶときに比較してください。Javaなどでプログラムを書くことに長けていれば、C ++、Objective-C、Swift、またはその他のオブジェクト指向言語の学習にそれほど苦労することはありません。それはあなたが学ぶのは概念と思考だからです。

OpenGL、Direct3D、Metalのいずれかを選択するのは、主にターゲットとするオペレーティングシステムです。Direct3Dは主にWindows、Metal on OS XとiOSで利用でき、OpenGLはOS X、iOS、Windows、Linuxを含むほとんどのシステムでサポートされています。

グラフィックカードは、1枚または2枚しかサポートしていないカードを知らないので、おそらくこの決定にほとんど影響を与えません。専用のグラフィックスカードがない場合、リアルタイムでのレンダリングはすぐに問題になります。Intel HDグラフィックスとAMDのコンパニオンはすでにかなりのことができますが。

したがって、プラットフォームを選択してください。


免責事項:今のところ、Direct3DもMetalも使用していません。


2
>「Javaなどでプログラムを書くことに長けていれば、C ++の学習にそれほど苦労することはないでしょう」—これは真実ではありません。もがC ++の学習と使用に膨大な量の問題を抱えることになります。それをJavaまたは他の安全な言語と比較することは完全に不適切です。リストした他の言語(Objective-C、Swift、またはその他のオブジェクト指向言語)の場合、そのステートメントはほとんど真実ですが。
表示名

9

現在、APIパラダイムの移行期にあります。

バッファ、ユニフォーム、属性、レイアウト、およびプログラムを(暗黙の)グローバル状態としてバインドし、その状態で描画をディスパッチするという昔ながらの方法は、D3D11とOpenGLで共通です。ただし、(状態を確認していて、プログラムが最後に行うまで何をしたいのかわからない場合)オーバーヘッドが大きくなります。また、スレッドセーフではありません(ほとんどの場合)。

これが、新しいAPIが登場した(または間もなく登場する)D3D12、vulkanおよびMetalが最も目立つ理由です。これらのAPIを使用すると、プログラムをより細かく制御できるようになり、コマンドバッファを使用して実行する処理を事前に宣言できます。また、独自のリソース(頂点データ、テクスチャなど)をより直接的に管理することもできます。複数でそれらを使用する方がはるかに簡単です。

古いものと新しいもののどちらを選択するかは、割り当てたビデオメモリを適切に管理し、コマンドバッファを構築できるかどうかに基づいています。

  • 古いハードウェアでも「そのまま」機能するものが必要な場合は、古い学校のAPIの方が適しています。それらはまたよりよく知られており、オンラインでより多くの助けを得るでしょう。

  • 一方、ディスパッチコマンドの非同期の性質を処理でき、割り当てたすべてのバッファを追跡する必要がない場合は、次に、新しいAPIが何か役に立つかもしれません。


6
新しいエクスプリシットグラフィックAPIは、平均的なグラフィックプログラマが実際に使用するために設計されたのではなく、エンジンでインフラストラクチャの作業を行う人々、または本当にパフォーマンスを必要とする人々のためのものです。彼らはあなたにはるかに大きな銃を与え、あなたの足元にそれを向けます。
porglezomp 2015

3

個人的にはそれほど重要ではないと思います。あなたのプロジェクトに合ったものを選んでください。私は過去にD3DとOpenGLの両方を使用しました。重要なのは概念です。どちらをつかむにしても、理解する必要があります(たとえば)。

  • テクスチャとは何か、GPUでどのように使用されるか。
  • グラフィック開発の基本概念(頂点、プリミティブ、フラグメントなど)
  • カメラシステムはどのように機能しますか(たとえば、OpenGLのMVPマトリックス)。
  • シェーダーとは何か、それらを適切に使用する方法。
  • GPUの動作とマシンのCPUの違い。
  • GPUのメモリモデルとCPUのメモリモデルの違いは何ですか。
  • CPUで何を実行し、処理のためにGPUにオフロードする必要があるか。

他の人がここで述べたように、私たちは新しいAPIセット(Vulkan、Metalなど)への移行の最中であるので、この時点でグラフィックス開発に完全に慣れていない場合は、おそらくGLSLに焦点を当てることは、Vulkan同様にそれを利用します。

移植性に関しては、D3DはWindowsのみです(WineプロジェクトがD3DをLinuxで動作させようとしているという噂がありますが、これまでのところ実現可能なものはありません)。OpenGLはクロスプラットフォームです。モバイルに移行したい場合は、OpenGL ESを利用できます。もちろん、OpenGLとOpenGL ESの両方に異なるバージョンがあり、すべてのプラットフォームでサポートされているわけではありません。

結局のところ、すべてのAPIはマシン上の同じハードウェアにアクセスします。それは、「どのように」アクセスするかだけの問題です。


Direct3Dは、Xbox本体のいずれかをプログラミングする場合にも使用します。
2015年

「実現不可能」とはどういう意味ですか?Wineは何百ものD3Dベースのプログラムを問題なく実行しており、何年も実行しています。もちろん、バグや実装されていない部分もありますが、それでもAPI全体が使用できなくなるわけではありません。
ルスラン

0

グラフィックカードなしでのレンダリングについて少し説明します。

Niether OpenGLもDirectXも本当にグラフィックカードを必要とします。実装は、完全にソフトウェアで加速される場合があります。

LinuxのOpenGLには、Mesaソフトウェアラスタライザがあります。私の経験では、奇妙な機能(表示リスト+インデックス付き頂点配列)を組み合わせてあまり強く押し込まない限り、問題なく動作します。実際のバグのリストは何マイルも高いと思います。継続的なテストを必ず行ってください!

WindowsでOpenGLを使用した経験が少ない。何かご存知の場合は、回答を編集してください。

DirectX SDKには、「参照ラスタライザ」と呼ばれるソフトウェアラスタライザが付属しています。私の意見では主にデバッグ用ですが、DX10のみに対応したラップトップでDX11を開発するときにリファレンスラスタライザを使用している友人が少なくとも1人いることを知っています。他の回答で述べたように、DirectXはMicrosoftのみです。


私の経験では、統合グラフィックスカードを使用することで、WindowsでのほとんどのOpenGL開発に十分対応できます。最新のOpenGLバージョンをサポートしていることを確認してください。
akaltar 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.