回答:
ほとんどない!
これは、「新しいプログラマがCではなくC ++を学ぶべきか」や「新しいアーティストが物理的な絵画ではなくデジタル絵画を学ぶべきか」と尋ねるようなものです。
特に、下位互換性がないため、グラフィックプログラマーは業界で最も一般的なグラフィックスAPIを除外するのは愚かです。新しいグラフィックスAPIがあるからです。さらに、OpenGLの動作は異なります。特にゲームの早い段階で、企業がVulkanよりもOpenGLを選択する可能性が高く、Vulkanを知っているかどうかに関係なく、OpenGLを知らない人には興味がありません。
専門化が市場性のあるスキルになることはめったにありません。
インディーデベロッパーのようにスキルを売り込む必要がない人にとっては、ツールボックスからツールを削除するのはさらに愚かなことです。独立系開発者は、柔軟性にさらに依存しており、資金を調達するものよりも、機能するものを選択することができます。Vulkanに特化すると、選択肢が制限されます。
専門化が効率的なパラダイムになることはめったにありません。
今すぐ始めて、GPUの作業をしたい場合(Unityなどのゲームエンジンを常に使用するのではなく)、Vulkanを学ぶことから始める必要があります。GLも後で学習する必要があるかもしれませんが、Vulkanを最初に考える理由はいくつかあります。
GLとGLESは、GPUがまったく異なる動作をする何年も前に設計されました。(最も明らかな違いは、イミディエイトモードのドローコールとタイリングおよびコマンドキューです。)GLは、イミディエイトモードスタイルで考えることを推奨し、多くのレガシーな問題を抱えています。Vulkanは、現代のGPUの動作に非常に近いプログラミングモデルを提供しているため、Vulkanを学習すれば、テクノロジーが実際にどのように機能し、何が効率的で何が非効率かをより深く理解できます。GLまたはGLESを使い始めて、VBOを使用する代わりにオブジェクトごとに個別の描画呼び出しを発行する、またはさらに悪いことに表示リストを使用するなど、すぐに悪い習慣に陥る人がたくさんいます。GLプログラマーにとって、推奨されなくなったものを見つけるのは困難です。
VulkanからGLまたはGLESへの移行は、その逆よりもはるかに簡単です。Vulkanでは、同時実行制御、共有、状態のレンダリングなど、GLに隠されているか予測不可能な多くのことを明示的にしています。ドライバーからアプリケーションに多くの複雑さを押し上げますが、そうすることで、アプリケーションに制御を与え、異なるGPUベンダー間の予測可能なパフォーマンスと互換性を簡単に得ることができます。Vulkanで動作するコードがある場合、代わりにGLまたはGLESに移植するのは非常に簡単で、最終的にはGL / GLESの適切な習慣を使用したものになります。GLまたはGLESで動作するコードがある場合は、Vulkanで効率的に動作させるために、特に最初からやり直す必要があります。特にレガシースタイルで記述されている場合(ポイント1を参照)。
最初は、Vulkanのプログラミングがはるかに難しく、大企業の経験豊富な開発者にとっては問題ないが、インディーズや愛好家にとって大きな障壁になることを懸念していました。私はこの質問をワーキンググループの一部のメンバーに投げかけました。彼らは、彼らがすでにバルカンに引っ越した人と話をした人々からいくつかのデータポイントを持っていると言いました。これらの人々は、UE4の統合に取り組んでいるEpicの開発者から、趣味のゲーム開発者までさまざまです。彼らの経験では、はじめに(つまり、画面上に三角形が1つになる)、より多くの概念を学習し、定型コードを長くする必要がありましたが、インディーズにとってもそれほど複雑ではありませんでした。しかし、その段階に到達した後、彼らは実際の出荷可能なアプリケーションを構築する方がはるかに簡単であることがわかりました。(a)さまざまなベンダーの実装間で動作がはるかに予測可能であり、(b)すべての効果がオンになった状態で良好に機能するものに到達するために、試行錯誤が必要なかったためです。実際の開発者からのこれらの経験により、Vulkanに対するプログラミングはグラフィックの初心者でも実行可能であり、チュートリアルを終えて他の人に提供できるデモやアプリケーションの構築を開始すれば、全体的な複雑さは軽減されると確信しました。
他の人が言っているように:GLは多くのプラットフォームで利用でき、WebGLは素晴らしい配信メカニズムであり、GLを使用する既存のソフトウェアがたくさんあり、そのスキルのために多くの雇用者が雇われています。Vulkanが成長し、エコシステムを開発している間、今後数年は続くでしょう。これらの理由により、GLの学習を完全に除外するのは愚かなことです。それでも、GPUの仕組みを理解するのではなく、GPUを理解するのに役立つものから始めれば、はるかに簡単な時間を過ごし、より良いGLプログラマー(そして一般的にはより良いGPUプログラマー)になります。 20年前。
もちろん、もう1つのオプションがあります。これが特にあなたに関係があるかどうかはわかりませんが、とにかく他の訪問者にそれを言うべきだと思います。
インディーズゲームの開発者、ゲームデザイナー、またはVR体験をするために、VulkanやGLを学ぶ必要はありません。多くの人がゲームエンジンを使い始めています(UnityまたはUE4は現在人気があります)。そのようなエンジンを使用すると、その背後にあるテクノロジーではなく、作成したいエクスペリエンスに集中できます。GLとVulkanの違いを隠すことができ、プラットフォームでサポートされているものを心配する必要はありません。ざらざらした詳細を一度に処理することなく、3D座標、変換、照明、アニメーションについて学習できます。一部のゲームまたはVRスタジオはエンジンでのみ動作し、フルタイムのGLエキスパートがまったくいません。独自のエンジンを作成する大規模なスタジオでも、グラフィックプログラミングを行う人は少数です。
GPUとやり取りする方法の詳細について学ぶことは確かに有用なスキルであり、多くの雇用主が高く評価するスキルですが、3Dプログラミングに入るためにそれを学ぶ必要があると感じるべきではありません。たとえそれを知っていても、必ずしも毎日使用するものではありません。
グラフィックスプログラミングの学習は、単なるAPIの学習以上のものです。グラフィックの仕組みを学ぶことです。頂点変換、ライティングモデル、シャドウテクニック、テクスチャマッピング、遅延レンダリングなど。これらは、実装に使用するAPIとはまったく関係ありません。
質問はこれです:APIの使用方法を学びたいですか?それとも、グラフィックスを学びたいですか?
ハードウェアアクセラレーショングラフィックスを使用するには、APIを使用してそのハードウェアにアクセスする方法を学習する必要があります。しかし、システムとのインターフェースをとれるようになると、グラフィックスの学習はAPIがあなたのために何をするかということに集中するのをやめ、代わりにグラフィックスの概念に集中します。照明、影、バンプマッピングなど
グラフィックの概念を学ぶことが目標である場合、APIで費やしている時間は、グラフィックの概念の学習に費やしていない時間です。シェーダーのコンパイル方法は、グラフィックスとは関係ありません。また、ユニフォームを送信する方法、頂点データをバッファにアップロードする方法などもありません。これらはツールであり、グラフィックス作業を行うための重要なツールです。
しかし、実際にはグラフィックスの概念ではありません。それらは目的を達成するための手段です。
それは取る多くの作業をして、あなたがグラフィックスの概念を学習を開始する準備が整いました地点に到達する前に、バルカンで学習します。データをシェーダーに渡すには、明示的なメモリ管理とアクセスの明示的な同期が必要です。などなど。
対照的に、OpenGLでそのポイントに到達するのに必要な作業は少なくなります。はい、私は最新のシェーダーベースのコアプロファイルOpenGLについて話している。
画面をクリアするだけの簡単なことを行うのに必要なことを比較してください。Vulkanでは、コマンドバッファー、デバイスキュー、メモリオブジェクト、イメージ、さまざまなWSI構造など、多数の概念を少なくともある程度理解する必要があります。
OpenGL ... glClearColor
ではglClear
、3つの関数:、、およびプラットフォーム固有のスワップバッファー呼び出しです。より最新のOpenGLを使用している場合は、2つまで減らすことができglClearBufferuiv
ます。バッファを交換します。フレームバッファが何であるか、またはその画像がどこから来たのかを知る必要はありません。クリアしてバッファを交換します。
OpenGLは多くのことを隠しているので、グラフィックスハードウェアへのインターフェイスを学習するのではなく、実際にグラフィックスを学習しているポイントに到達するための労力がはるかに少なくて済みます。
さらに、OpenGLは(比較的)安全なAPIです。通常、何か間違ったことをするとエラーが発生します。バルカンは違います。役立つデバッグレイヤーがありますが、Vulkan APIのコアはハードウェアの障害がない限りほとんど何も通知しません。何か間違っていると、ガベージレンダリングが発生したり、GPUがクラッシュしたりする可能性があります。
Vulkanの複雑さと相まって、誤って間違ったことをすることは非常に簡単になります。テクスチャを適切なレイアウトに設定することを忘れると、ある実装では機能しますが、別の実装では機能しません。同期ポイントを忘れることは時々機能するかもしれませんが、その後、一見何の理由もなく突然失敗します。などなど。
言われていることはすべて、グラフィック技術を学ぶことよりもグラフィックを学ぶことの方が多くあります。特に、バルカンが勝つ分野が1つあります。
グラフィカルなパフォーマンス。
通常、3Dグラフィックプログラマーになるには、コードを最適化する方法についてある程度のアイデアが必要です。そして、OpenGLが情報を隠し、背後で物事を行うことが問題になるのはここです。
OpenGLメモリモデルは同期です。実装は、ユーザーが違いを認識できない限り、非同期にコマンドを発行できます。そのため、何らかのイメージにレンダリングしてからそれを読み取ろうとすると、実装はこれら2つのタスク間で明示的な同期イベントを発行する必要があります。
しかし、OpenGLでパフォーマンスを実現するには、実装がこれを行うことを知って、それを回避できるようにする必要があります。実装が同期イベントを密かに発行している場所を認識し、コードを書き直して可能な限り回避する必要があります。しかし、API自体はこれを明らかにしません。どこかからこの知識を得ている必要があります。
Vulkan を使用すると、これらの同期イベントを発行する必要があります。したがって、ハードウェアがコマンドを同期的に実行しないという事実に注意する必要があります。これらのイベントをいつ発行する必要があるかを知っておく必要があります。したがって、おそらくプログラムの速度が低下することに注意する必要があります。だから、あなたはそれらを避けるためにあなたができるすべてをします。
Vulkanのような明示的なAPIを使用すると、こうしたパフォーマンスの決定を行う必要があります。したがって、Vulkan APIを学習すれば、どのようなものが遅くなり、どのようなものが速くなるかについて、すでに十分なアイデアを持っています。
新しいレンダーパスを作成せざるを得ないフレームバッファーの作業を行う必要がある場合は、レンダーパスの別のサブパスに収めることができる場合よりも遅くなる可能性が高くなります。それができないという意味ではありませんが、APIはパフォーマンスの問題を引き起こす可能性があることを前もって通知します。
OpenGLでは、APIは基本的にフレームバッファの添付ファイルを自由に変更するように誘います。どの変更が速いか遅いかについてのガイダンスはありません。
したがって、その場合、Vulkanを学習することで、グラフィックスを高速化する方法をよりよく学ぶことができます。そして、それは確かにCPUオーバーヘッドを削減するのに役立ちます。
グラフィカルレンダリングテクニックを学ぶことができるようになるまでには、さらに時間がかかります。
OpenGLの最大の魅力は(少なくとも私にとって)、多くのプラットフォームで動作することです。現在、VulkanはOSXでは動作せず、AppleにはMetalと呼ばれる競合するAPIがあります。AppleがVulkanをサポートするまでにはしばらく時間がかかる可能性が非常に高く、サポートする場合、Vulkanのサポートは最新のハードウェアに限定される可能性があります。OpenGLはすでにほとんどのハードウェアをサポートしており、引き続きサポートします。
何をしたいかによって異なります。自分だけのためにグラフィックプログラミングを学びたい場合は、何を選択してもかまいません。
プロの仕事を考えているなら、バルカンをお勧めします。ハードウェアに近いため、グラフィックプログラマーにとってハードウェアの機能に関する知識は重要だと思います。
Vulkanはハードウェアにより近くなっています。OpenGLは、Vulkanではコマンドキューの実行など、手動で行う多くの機能を内部で実行するためです。また、メモリ管理はドライバーではなくアプリケーション次第です。メモリの割り当てuniforms
(CPUからGPUに渡す変数)、それらの追跡について心配する必要があります。心配することはたくさんありますが、メモリ使用の自由度も高まります。怖くて圧倒されるかもしれませんが、実際はそうではありません。学ぶ必要があるのは次のAPIだけです。
このことを理解することは、GPUの仕組みを理解するのにも役立ちます。VulkanとOpenGLの両方でいくつかの最適化を行うことができます。
そしてもう1つ思い浮かぶのは、おそらくVulkanの1つとして仕事を探しているときにグラフィックプログラミングを学び始めているのであれば、より人気がある(おそらくOpenGLよりも人気がある)ことです。また、私が知っている限りでは、いくつかのグラフィックスAPIを使用している企業のほとんどは、独自の関数を記述しているため、ジョブではOpenGLやVulkanで記述しない可能性がありますが、GPUに関する知識は常に役立ちます。
私はここ数か月間、グラフィックスプログラミングに「参加」しています。
現在、私はまだ高校に在籍しており、クロスプラットフォームアプリケーションの開発をほぼ常に検討していると言えます。これは実際、Vulkanでの私の最大の問題です。すべてのプラットフォームで動作するように開発されているわけではありません。JavaでOpenGLを使用しており、6か月以上使用しています。
私が抱えているもう1つの問題は、Vulkanの主張にあります。OpenGLは確かにWebサイトを頻繁に更新していません。彼らは継続的にアップデートをリリースし続けており、私は常に、より高速に動作するか、新しいハードウェアでより良く動作する新しいアップデートを楽しみにしています。
そうは言っても、私はほとんどOpenGLで作業していますが、DirectXとVulkanの基本原則を理解しています。特にVulkanは、学ぶのが非常に難しく、プログラミングのためにOpenGlやDirectXほど構造化されていないので、私は彼らと広範囲には働きません。
最後に、私が主にJavaを使用し、OpenGLがスタンドアロンで驚くほど市場性がないように、単一の分野に特化したものを追加したいと思います。ゲームを作っている会社に就職したい場合、ほとんどの場合、OpenGLはLinuxおよびAndroid開発用のゲームを作成するためだけに使用されます。DirectX for Windows and Consoles <場合によってはVulkanが置き換えることができるもの。
OpenGLのアップデートを永遠に我慢することはできません。しかし、開発することは私の好みです。
このテーマに関するグラフィック初心者向けの視点をお伝えしたいと思います。私が気付いたのは(長年、別の分野でエンジニアとして働いていた)、基本的な概念が最も重要な部分であるということです。それらをしっかりと理解したら、最後の光沢のある新しいAPIを学ぶことは最も難しい部分です。あなたが新しいSkyrimをプログラムしようとしている若い趣味なのか、CG分野で仕事を探しているのかはわかりません。
私は、コンピューターグラフィックスを「プロのように」学ぶことが最善の方法だと思います。
線を引く方法を理解する前にパフォーマンスを心配し始めることは、運転免許証を取得する前に車の空力を心配するようなものです。
私は正式な教育を受けずにC ++で自習しており、過去15年間、OpenGL 1.0からModern OpenGLとDirectX 9c、10および11の両方を学びました。バルカンで私の手を試してください。Vulkanを使用して単純な三角形または単純な回転する立方体を描くための基本的なチュートリアルをいくつか完了しました。DirectX 11およびOpenGL 3.3+と同様に、完全に機能する3Dゲームエンジンを作成し、それらを使用して単純なゲームを構築しました。
私はそれが学習している人の全体的な環境に依存していると言わざるを得ないでしょう。3Dグラフィックプログラミングを始めたばかりの場合は、たくさんのチュートリアル、リソース、例、すでに動作しているアプリケーションがあるため、OpenGLまたはDirectX 11に飛び込むことをお勧めします。3Dグラフィックスを学ぶことは決して簡単なことではありません。
プログラミングの側面から離れて、データセットやデータ構造、アルゴリズムに至るさまざまなレベルの数学を含む、どのような手法が使用されているかという概念に焦点を当てる場合、3Dゲームエンジンを構築したり、既存のゲームエンジンを効果的に使用したりする前に、まず知って理解しなければならないことがたくさんあります。
背後にある数学と理論のすべてをすでに理解しており、プログラミングの経験がある場合は、UnityやUnreal Engineなどの既存のAPI、ライブラリ、アプリケーションを使用して、アプリケーションを動作させるために必要なソースコードとスクリプトを書くことができます。
したがって、ゲームを構築するためだけに簡単なゲームを構築しようとしているのであれば、私自身の理解と私がそれを見る方法からこれがそうです。制作時間が大幅に短縮される既存のフレームワークを使用してください。一方、ゲームエンジン/物理エンジン/アニメーションエンジンとシミュレーターがどのように設計されているのかを理解し、自分でビルドしたい場合は、DirectXなどのAPIを選択するか、 OpenGLまたはVulkan。ここでの決定要因の1つは、既存のプログラミング知識でもあります。つまり、マルチスレッド、同期呼び出しと非同期呼び出し、メモリフェンス、データ競合、セマフォ、および並列処理(並列プログラミング)について何も知らない場合、
スレッドとアクセス時間とともにメモリを適切に管理する方法がわからない場合、これについて言及します。バルカンはあなたをかみ傷にします!OpenGLとDirectXがずっと多くのCPUパワーを消費するまでずっとあなたの手を握っています。
プログラミングの知識レベルが適切であり、代数、幾何学、三角法、ブール代数、確率、統計、ベクトル-マトリックスベースの代数、計算I、IIなどのすべてのレベルを含む次の数学の背景がある場合インフィニティ(笑)。ベクトル計算、線形代数、線形方程式のシステム、多変数計算のベクトル計算による解析幾何学、数と集合の理論、データセットと構造、計算分析、計算およびアルゴリズム設計。その後、実際のゲームエンジンを作成するために必要な概念を理解できます。これには、必要な応用数学や物理方程式はありません。その背景と十分なプログラミング経験、特にメモリ管理とポインター演算を取得したら、ゲームエンジンの構築を開始できます。
したがって、ここで重要なことは、高度なグラフィックプログラミングを行うために、ゲームエンジンを作成するために必要なすべての側面を理解する必要があるということです。2Dグラフィックスだけを実行している場合、前述のAPIなしでPythonで実行できるので、人生はそれほど難しくありません!しかし、真剣になり、多くの機能セットを備えた堅牢な完全なパワーハウスゲームエンジンを設計したい場合、ここでの選択はCまたはC ++で、OpenGL、Direct XまたはVulkanを使用します。それらのどれでも大丈夫でしょう。エンジンを最初から構築していて、リソースオーバーヘッドが最小で最も「効率的な」実行中のエンジンを探している場合は、Vulkanを選択します。しかし、あなたがこのルートに行くなら、少なくとも私が上で言及したことといくつかを知っているべきです!
ご覧の通り、Vulkanはこの分野の初心者プログラマー向けではありません。数学、プログラミングパラダイム、スレッド化、メモリ同期、並列プログラミングなど、さまざまな種類のデータセットとアルゴリズムのすべてについて、広範な知識が必要です。そしてそれでも、アプリケーションが画面に単純な2D三角形をロードするようにするだけです。OpenGLの約100行のコードまたはDirectXの250行のコードで何ができるかは、Vulkanの約1,000行のコードを必要とします。
Vulkanは、アプリケーションでVulkanを使用する方法のすべての側面を担当するため、すべてをあなたに任せます。手に持っていない、邪魔にならない、足で自分自身を撃つ、または再帰的な縄を買って自分を掛けることができます!
さて、これは初心者やこの分野に慣れていない人はVulkanを学ぶべきではないということではありませんが、私が彼らに提案するのはこれです:まず、OpenGLやDirectXを十分に学んで、基本的なアプリケーションは、単純な三角形または回転する立方体をレンダリングするためだけに構成されています。APIとその構造の繰り返しパターンに精通します。並列でVulkanを学習できることを学びながら、このように3つのそれぞれが同じタスクを達成している方法を見ることができますが、異なる方法でそれを行う方法を知っているし、異なるAPIとの間で結果を比較することもできますそこから、どちらを優先するかを選択できます。この方法では、ツールボックスに別のツールが追加され、3つすべてをサポートするアプリケーションを作成して、
最終的に、どのルートを下りたいかを選択するのはその人次第であり、そこからの成功は、献身、絶え間ない研究、勤勉、試行錯誤、そして最も重要なことには失敗によって決まります。失敗しなければ成功しません!失敗し、間違いを見つけ、それを修正し、次に進み、戻って、もう一度やり直した場合にのみ成功します!
多くのプラットフォームで、グラフィックスの標準であるOpenGLを最初に学習する必要があります。
新しいライブラリがあったとしても、基本を理解し、業界全体で使用されている言語で作業することは非常に重要です。特にVulkanはしばらくの間大企業で使用されないためです。
誰もすぐに適応して、安定していないフレームワーク/ライブラリで自分自身を台無しにすることを望みません。
現在のOpen-GLプログラマーを雇用/再訓練する必要があり、その必要はありません。
また、OpenGLとVulkanはまったく同じではないと聞いたことがあります。VulkanはOpenGLよりも低レベルのAPIであり、マシンコードに近いと聞きました。
私が見つけたこの答えには、たくさんの素晴らしい情報があるようです
https://gamedev.stackexchange.com/questions/96014/what-is-vulkan-and-how-does-it-differ-from-opengl
考慮すべきもう1つのことは、OpenGL 1で発生した問題です。
OpenGL 1からOpenGL 2には大きな変更があり、多くの人がOpenGL1を使用しており、ハードウェアがそれをサポートしていたため、一部のアプリケーション/エンジンで実装するために後方互換性が必要であり、開発者がそれをサポートし続けるのは本当に苦痛です。
サポートに加えて、言語は大きく変化したため、新しいことを学ぶ必要がありました。
これは、JavaFX(1.xから2.x)およびPlay!などのフレームワークで発生しました。フレームワーク(1.xから2.xも)。フレームワークを完全に変更します。つまり、すべてを再学習する必要があります...
したがって、基本的には、Vulkanが安定するまで待つ必要があります。これは、おそらく2.0パッチがリリースされるまで待つことを意味します。ITは、Vulkanの基本について学ぶことができないという意味ではありませんが、これが変わる可能性があることを知っているだけです。Kronosのようなグループは最初から非常に安定したAPIを提供すると想定します。特に、Vulkanには複数のNvidiaとAMDのエンジニアがいます。ただし、他のソフトウェアと同様に、コーダーは最初からどれだけうまく機能するかを確認しますが、多くは慎重で何が起こるかを待っています。