最近、私はゲームスタジオでジュニアグラフィックプログラマーのインタビューを受けました。 その結果、私は彼らが初心者プログラマーに期待するスキルと彼らが尋ねることができる質問を見つけました。 この記事では、質問を便利なリストに入れました。 ポイントは、他の初心者プログラマーが最初のインタビューに行く前に準備するためにそれを使用できるということです。 しかし
、これらの質問に対する答えを覚えているだけではお勧めしない予約をしたいと
思います 。 リストのトピックは、実際のグラフィックプログラミングの問題を解決するために理解して習得する必要があるトピックです。 答えを覚えるのではなく、それらを理解する必要があります。
質問は
、C ++、数学、最適化、コンピューターグラフィックスのトピックに分かれています。 明らかに、これらは日常業務の主要なトピックです。 C ++は実際のタスクでよく使用されるため、インタビュー中に多くの質問をするのは当然です。 さらに、グラフィックスプログラミングでは、他のほとんどの種類のプログラミングよりも数学の知識が必要です。これが、数学のスキルが最も重要な理由です。 最後に、60 FPSと高忠実度のレンダリングを実現するには、強力な最適化スキルが必要です。 各カテゴリの一般的な質問を見てみましょう。
C ++の質問
- 仮想デストラクタはいつ使用する必要がありますか? (インタビュアーはこの質問に絶対に喜んでいます!)
- ヒープとスタックにメモリを割り当てることの違いは何ですか?
- C ++ 11およびC ++ 14のどの機能を使用しますか?
- テンプレートは何に使用されますか?
inline
説明してください。- 順方向と逆方向のバイト順(高から低、低から高)は何ですか?
- const-correctnessとは何かを説明する。
- 仮想関数の呼び出しに関連するオーバーヘッドは何ですか?
- おそらく、いくつかの質問では、
&
、 /
などの演算子の助けを借りて、ジャグリングビットに関するいくつかのトリックを実行するように求められます。 - おそらくいくつかの質問では、ツリーのようなポインターで接続されたデータ構造で何かをするように求められます。 たとえば、リンクリストを描画します。
- C ++のポインタのサイズは何ですか(つまり、
sizeof
はポインタに対して何を示していますか?)
原則として、言語の高度な機能については何も質問されません。 たとえば、幸運なことに、テンプレートのメタプログラミングを実行するように依頼されたことはありません。
数学の質問
実際、数学の問題はかなり単調です。
- スカラー積とは何ですか?
- ベクター製品とは何ですか?
- オイラー角の代わりに四元数を使用する必要があるのはなぜですか?
- 行列を適用してオブジェクトを変換する方法は? たとえば、オブジェクトをスケーリング、変換、回転するためにマトリックスを使用する方法は?
- 光線と平面/球体/三角形の交差点を計算する方法は?
- ワールド空間、オブジェクト空間、カメラ空間の概念を説明します。
おそらく、彼らはスカラー積、ベクトル積、四元数の使用に関連するいくつかの実際的な問題を解決することを提案するでしょう。
最適化に関する質問
- レイトレーサーを高速化するために、境界ボリューム(またはoctreeなど)の階層を適用する方法は?
- キャッシュ(L1、L2キャッシュなど)について教えてください。
- データ駆動設計とは何ですか?
- マルチスレッドとSIMDを使用して、可視性のピラミッドのクリッピングを最適化する方法を説明します(たとえば、 Andreas Asplundのブログ投稿を参照)。
- GPUパフォーマンスプロファイリングツールの使用経験はありますか?
ゲームスタジオは、NVIDIA Nsightなどのツールを使用してコードのプロファイリングと最適化の経験を積むことを推奨しているようですので、チェックしてください。 キャッシュメモリなど、コンピューターアーキテクチャに関する
もう1つの優れた書籍を紹介します。
コンピュータグラフィックスの質問
- どのような平滑化方法を知っていますか(オプション:MSAA、MLAA、FXAA、TXAA)?
- レンダリングエンジンの典型的な要素は何ですか(たとえば、可視性ピラミッドのクリッピングを処理するシステム、シャドウをレンダリングする、遅延/直接シェーディングなどの光源を処理するシステム、エンジンでマテリアルを処理するシステムなど)。
- シャドウ生成のどの方法を知っていますか(シャドウ生成手法、たとえば差分シャドウマップ、指数関数を使用したしきい値の平滑化、モーメントのより新しい方法など )。
- 遅延レンダリングの長所と短所は何ですか?
- 物理的に正しいレンダリングとは何ですか?
- レンダリング方程式の仕組みを説明できますか?
- BRDFとは何ですか? 「BRDFはエネルギーを節約する」と言うとき、彼らはどういう意味ですか?
- シェーダーのブランチパフォーマンスへの影響は何ですか(ヒント:GPUアーキテクチャのワープの概念についてお読みください)。
- 古いOpenGLやDirectX 11と比較して、VulkanやDirectX 12などの新しいAPIの利点は何ですか(ヒント:主なものはドライバーの負荷の軽減です)。
- あなたが読んだチャートの最後の科学記事は何でしたか、それを説明できますか(これはかなり一般的な質問です)?
- グラフィックスパイプライン全体を説明します(答えはおそらく非常に長くなります。頂点シェーダーとフラグメントシェーダー、透視補正補間、Zバッファー、フレームバッファーのダブルバッファー、アルファミキシング、変換マトリックス、均一座標、反射モデルについて説明します。フラグメントシェーダーなどで)。
最後の質問は、インタビュー中に特によく起こります。 パイプラインのすべての部分について完全に確信がない場合は、小さなソフトウェアラスタライザーを作成することをお勧めします。 ソフトウェアラスタライザーを作成することは、グラフィックパイプラインをゼロから実装することに似ているため、この演習では、パイプラインをより深く理解することができます。
上記の多くは準備質問です。 その後、より深い質問が続きます(会社を代替しないために、私はそれらを開示しません)。 ただし、上記の質問リストは、雇用主が初心者プログラマーにどのような知識を期待しているかをよく理解しています。
皆さんの中には、コンピューターグラフィックスで作業するためのカリキュラム科目をまだ勉強して選択している人もいます。 私のアドバイスは、主に高性能コンピューティングと応用数学に集中することです。 プログラミングの主題から、マルチスレッド、コンピューターアーキテクチャ、GPGPU、および高性能コンピューティングに関連する他のトピックを習得してください。 数学のコースには、線形代数、多次元計算(米国ではこのコースはCalculus IIIと呼ばれます)、確率理論、数値最適化、微分方程式、計算幾何学があります。 まず、コンピューターグラフィックスではそれほど必要ではないため、トポロジや抽象代数などのより抽象的な数学的トピックではなく、応用数学に焦点を当てます。
一般に、コンピュータグラフィックスのすべてのニュアンスを理解することは期待されていません。 コンピューターグラフィックスの概念は、グローバルライティング、オクルージョンカリング、シャドウ生成、パストレーシング、流体モデリング、ジオメトリ処理、GPGPU、物理的に正しいレンダリングなど、幅広いトピックをカバーしています。 ジューンがこれらのトピックのすべてのニュアンスを知っていることを期待するのは不合理です。 ただし、履歴書に何かを指定する場合は、このトピックに詳細に答える準備をしてください。
したがって、コンピュータグラフィックスに関するすべてを知る必要はありません。 多くの場合、作業した主なプロジェクトについて話すように求められます。 その後、インタビュアーはさらに多くの質問をし、プロジェクトの詳細を詳細に説明するように求めます。 したがって、私のアドバイス:インタビューの前に、特に誇りに思ういくつかのプロジェクトを選択し、詳細な説明の準備をします。
私の意見では、インタビューの準備をする最良の方法は、自由時間に多数のサードパーティのプロジェクトに取り組むことです。 自分が取り組んでいるプロジェクトを実演することは、自分自身を示し、このビジネスに本当に情熱を持っていることを示す良い方法です。 最後に、サードパーティのプロジェクトに取り組むことで、プログラミングスキルが磨かれます。 そして、これは、この記事に記載したすべての質問に答えるのに非常に役立ちます。