簡単な言葉での3Dグラフィックスについて

パート1.はじめに


こんにちは、私の名前はbaldurkです。 私はグラフィックプログラマーとして数年働いているので、決して専門家ではありませんが、グラフィックスの操作に関連するすべてのことをすでによく理解しているようです。

この一連の投稿のアイデアは長い間私の心の周辺に浮かんできており、最新のDeus Exの分析で興味深い記事を読んだ後に再び浮上しました。

グラフィック、特に現代のゲームで達成される複雑さは興味深いトピックであるように思えます。 すべての詳細を深く掘り下げたいと思う人はほとんどいませんが、誰もが興味を持っているトピックがあると思います。 ゲームをプレイしたほとんどの人は、これらの効果やそれらの効果がどのように得られたのか、または新しいゲームでこのような素晴らしいグラフィックを作成するためにどのようなテクノロジーを使用したのかについて興味がありました。


Watch Dogsのようなプロジェクトは言うまでもなく、単純な3Dゲームを作成するためにも多くのコンポーネントが必要です。

この記事で何を検討する必要があるかについての一般的な考えしかありませんが、どのトピックが関心を引くかによって異なります。 ただし、主なアイデアは、読者を怖がらせることなく、現代のゲーム内で起こっていることの一般的な説明を作成することです-私はあなたが数学とプログラミングの知識を持っていないと仮定します。 CPUとグラフィックカードの違いがわかっていて、RAMとハードドライブを区別している場合は、これで十分です。残りについて説明します。

この記事は、プレゼンテーションをわずかに構成するために、ビデオウォークスルーChip&IronicusのWatch DogsのLet's Playに従って開発されます。 ゲームはそのグラフィックでよく知られています(そしてそれについての意見は完全に反対になる可能性があります)。また、別の例で検討できる多くの側面があります。 おそらく他のゲームについてお話します。

まず、すべてのゲームでほぼ同じ基本を説明することから始めますが、Watch Dogのテクニックと視覚効果についても見ていきます。

RenderDocというツールを使用します。これは、暇なときに書いたものです。 グラフィックの問題をデバッグするために使用されます-このツールを使用すると、グラフィックフレームをパーツに分解できます。これにより、どのように統合されるかがわかります。


このアニメーションは、グラフィックカードを使用してレンダリングするプロセスで徐々に作成されるフレームの一部を示しています。

ほとんどの人は、コンピューターグラフィックス(および他のビデオのグラフィックス)が一連の静止フレームで構成され、各静止フレームが一定の秒数の間表示されることを知っています。 映画では、従来は毎秒24フレーム(毎秒フレーム、FPS)を使用していましたが、テレビでは周波数はほぼ同じで、約24〜30フレームです。 ゲームでは、各フレームで多くの作業が行われるため、FPSは変更可能です。 30を下回る周波数の低下は望ましくありませんが、頻繁に発生します。 通常、コンソールゲームの上限は60 FPSです。 開発者は、ゲームの目標に応じて30または60の頻度を実装するよう努めています。 高フレームレートのディスプレイを搭載したPCでは、90、120、またはそれ以上を実現できます。 これらの特定の数値の理由は垂直同期(vsync)であり、これについては以下で説明します。

精神的には、反対側からこの問題を見ることができます-FPS周波数がどれだけ高いかを見る代わりに、各フレームに割り当てられる時間の量を見てください。 ゲームを30 FPSの周波数で動作させたい場合、フレームに必要なすべての作業を完了するのに33ミリ秒しかありません。 60 FPSでは、時間は半分になります-約17ミリ秒。 コンピューターであっても、実行する必要がある作業量を考えると、この期間はそれほど長くありません。 数量を把握するために、大まかな推定によると、弾丸は1ミリ秒あたり約1メートル移動します。

このプラットフォームはオープンであるため、主にPCについて説明します。秘密保持契約(NDA)に違反することを恐れずにコンソールについて話すことはできません。 とにかく、基本的に私はコンソールであまり違いがないことについて話しますが、何かがまだ異なる場合は、これを強調します。 モバイルプラットフォームの場合、PCハードウェア/コンソールとモバイルハードウェアの違いのほとんどは、私の記事のトピックには関係ありません。


正直なところ、この写真をここに置いて、記事がテキストだけでなく理解できるようにしています。

私たちが興味を持っているのはこのタスクです。AI計算のすべてがどのように実行されるか、またはオブジェクトを移動するための物理シミュレーションがどのように実行されるかについては心配しません。 「グラフィックスプログラミング」と呼ばれる分野の境界はかなりぼやけていますが、フレームの構築に必要なすべての情報が揃ったときにグラフィックスプログラミングが始まります。何が起こるか、すべてのテクスチャとモデルはメモリ上にあります(ディスク上ではありません) )、アニメーションは既にアニメーション化されており、物理学がカウントされ、画面に表示するために完成したフレームを描画するだけです。

Watch Dogsのようなかなり伝統的なレンダリングの3Dゲームを検討することを付け加えます-基本的な原則の多くは2Dゲームに適用されますが、それらのコンセプトを示すのは少し難しくなります。 また、(特にグラフィックプログラマーに)私は主に理解に努めていることを説明します。したがって、おそらく、目標を達成できる場合はかなり怪しい説明を使用します。

パート2.フレームの構成


ほとんどの場合、1つのフレームだけを見て、ゲームが完成したフレームを作成するために使用するビルディングブロックについて説明します。 また、この部分には、いくつかの新しい美しい写真があります。

フレームをビルディングブロックから組み立てる方法はいくつかあります。 プレーヤーに表示される完成した画像は、すぐにはレンダリングされません。 すぐに、それは何年も前に描かれましたが、現代のグラフィックエンジンはほとんどの場合、何らかの前処理を使用します。 グラフィックエンジンは、完成したフレームを画面に表示する前に、最終画像の計算に役立つさまざまなタイプの多くの中間画像を描画します。

これらの画像は、エンジンの種類とグラフィックプログラマーが適用する必要のある手法に大きく依存しています。 たとえば、太陽光で正しい影を作成したい場合、影には1種類の画像が必要になります。 彼はまた、プレイヤーがコントロールする車に正しい反射を必要とするかもしれません。そしてこのためにも、反射のある別の画像が必要です。







Watch Dogsフレームの構築に使用される中間画像のさまざまな例。

この記事では、Watch Dogsフレームで使用される各画像については説明しませんが、何かを学ぶために基本的な画像のみを検討します。 これは、グラフィック研究が絶えず行われている分野であり、新しい技術が出現しています。 イノベーションも小さなレベルで発生しますが、マーケティングが新しいグラフィカル機能について説明するとき、通常はそのような改善を指します。



これらの中間イメージはそれぞれ、さらに小さなフラグメントからも構築されます。 シーン内の各オブジェクトまたは関連オブジェクトのグループは、 テクスチャモデルとして個別に作成されます。 ゲームを開発する際、アーティストはこれらのモデルを3Dエディターで構築し、それらに必要なすべてのリソースを作成します。 次に、レベルエディターを使用してこれらのモデルを世界に配置し、それらから仮想都市を徐々に構築します。

おそらく、ほとんどの人がこれを知っています。過去20年間、リアルタイムの3Dグラフィックスの開発を見ていれば、今日の複雑なモデルがどれだけ増えているかを知っています。 グラフィックスの形成の最初の段階では、テクスチャマッピングはコストのかかるプロセスでしたが、可能であれば、同じ色でオブジェクトをペイントすることでそれを取り除きました。 テクスチャは、目や顔など、本当に細部が必要な要素にのみ残されていました。

3Dモデルは、オブジェクトの形状を形成する相互接続された三角形のみで構成されています。 各三角形には頂点と呼ばれる3つのポイントがあり、三角形は互いに接続されているため、複数の三角形で頂点を共有できます。 頂点と三角形は十分に重要なので、後でこれに戻ります。 また、たとえば、キャラクターや木などのオブジェクトは、レンダリングする前にアニメーション化する必要があることを覚えておく価値があります。 モデルは標準の静的形式で作成され、アニメーションは各フレームに適用されます。 これにも戻ります。


これは、アニメーション後のエイデンピアースの頭の3Dモデルです。 通常のように、三角形は平らに描かれ、平滑化されていないため、表示されます。

3Dモデルに詳細を追加するために、テクスチャが重ねられます。 テクスチャは通常のフラットな画像ファイルで、通常は正方形または単純なサイズ(2:1の比率の長方形など)です。 テクスチャは、より複雑なプロセスを使用して3Dモデルに重ねられます。これについては以下で詳しく説明しますが、概念的にはギフトを包むプロセスに似ています。 ペーパーラッパーの単純な繰り返しパターンの代わりに、画像はラッパーのサイズと正確に一致します。 接着剤で組み立てるための紙のモデルを見た場合、原理は同じです。

これらのテクスチャは通常、紙モデルで行われるように3Dモデルをフラットブランクに「展開」することで作成され、その後にその上にテクスチャが描画されるため、この類推はあなたが思うよりも適切です。 多くの場合、この展開は自動的に実行されますが、特に複雑なオブジェクトの場合は手動で実行できます。


これは、上記のAiden Pierceヘッドモデルに対応するテクスチャです。 歯と舌用の部品があります。 Aiden Pearce™Legendary Baseball Capで恒久的に覆われているため、額の上の部分はテクスチャ化されていません。

ご注意


展開すると、オブジェクトのより詳細な部分が増加し、他の部分が減少します。

特にカスタマイズ可能なキャラクターの場合、彼らはモデルのさまざまな「スキン」について頻繁に話します。 今日、「スキン」と呼ばれるものは通常、モデルの小さな変化(新しいベルトまたは異なる帽子)を指しますが、最初は同じモデルが使用されたためにこの用語が生じましたが、テクスチャが変更されました(または「スキン」-文字通り「スキン」)が異なるキャラクターを作成します。 今日でも、そのようなテクスチャの助けを借りて、NPCやオブジェクトの大きな可変性を作成でき、時間とお金を節約できます。多くのユニークな3Dモデルを作成する必要はありません。 エイデンが着ることのできるさまざまな服は、多くの場合、同じモデルの異なる質感です。


以下は、3Dモデルの頭部回転の簡単なスニペットです。 テクスチャのみを重ね合わせ、それ以上は何もしません。

検討中のフレームでは、メインレンダリングパーツに約1700個のオブジェクトが描画されています。 それらの一部は同じモデルになります-鉢花やゴミ箱などのオブジェクトは実際には別々に作成されることはありません。これは1つのモデルまたは異なる場所に配置された複数のモデルです。 ただし、フレームを完成させるために描画されるオブジェクトのおおよその量は4700に近いため、これらすべてのモデルのレンダリングに加えて、追加の作業をどれだけ行う必要があるかがわかります。

オブジェクトの別の例を見てみましょう-アイデンが着用している野球帽。



これは、テクスチャとテクスチャ付きの野球帽モデルです。 テクスチャは、モデルに接続された個別のパーツで構築されていることがわかります。

ご注意


スキャンは非常に複雑になる可能性があり、必要に応じていくつかの異なる部分で実行できるため、バイザーとテクスチャの野球帽の主要部分は接触しません。 時には、目に見える問題や継ぎ目のない複雑な形状のモデルをテクスチャリングするには、かなりのスキルが必要です。

アイデンの頭で見たのと同じ原則がキャップにも当てはまります。 実際、アンラッピングの実行に必要な特定のテクスチャと数値を無視する場合、原則は常に同じです。

開発中に何が問題になる可能性があるかを示し、グラフィックスをプログラミングするときの楽しみ方を示すために、小さな実験を行うことができます。 ほとんどのテクスチャのサイズは標準の正方形であり、モデルのテクスチャのラッピングと展開の方法は同じなので、少し遊んでみませんか? アイデンの頭のテクスチャを野球帽モデルに適用するとどうなりますか?


Aiden Pierce Legendary Baseball Capとはあまり似ていません。

野球帽のテクスチャにロゴがあった場合、耳と歯は頭のテクスチャにあります。 バイザーがある場合、頭のテクスチャーには髪の毛しかありませんでした。 オーバーレイはまったく同じですが、異なるテクスチャが使用されます。 もちろん、この例はゲームでは間違いになりますが、テクスチャをアニメートしたり、ちらつくようにした場合に何ができるかを考えてください。ゲームでは、これらのことを気づくことができるさまざまな効果に使用します。 特に、ゲームSaint's Row 4は、「シミュレーション」の特殊効果のために同様のものを使用します。

また、この結果を反映することも有用です。ゲームでは、モデルとテクスチャのペアを非常に慎重に組み合わせます。つまり、最もユニークなモデルは、独自のテクスチャに一致する必要があります。

もちろん、この規則は絶対的なものではありません-場合によっては、スペースを節約するために、テクスチャは多くのオブジェクトに使用できる標準の繰り返しパターンです。 リンクされたオブジェクトのセット(たとえば、新聞販売代理店)は、異なる新聞に同じテクスチャを使用でき、各新聞はテクスチャのごく一部を占めます。

それにもかかわらず、これは、最終イメージを構築するために、すべてのビルディングブロックが存在する必要があることを意味します。つまり、多くの必要なモデルとテクスチャを取得できます。 次のパートでは、リフレクションなどの一部の側面を正しく実装することが非常に難しい理由について説明します。 また、ゲームで時間とリソースを節約するために小さなトリックを使用する方法についても説明します。

パート3.描画する必要がないもの


多くの場合、グラフィックのプログラミングは、さまざまな制約のバランスを取り、完璧な妥協点を得る作業です。 最後の部分では、シーンが描画されるたびに、人、車、道路標識、建物など、多くの小さなビルディングブロックからシーンが組み立てられることがわかりました。 画面上にあるものはすべて、描画する必要がある個々のコンポーネントで構成されています。 ここでは、いくつかの微妙なバランス調整操作について説明します。

中央処理装置とグラフィックカードは、フレームのレンダリングで連携して動作します。 ゲームの残りの部分はCPUで実行されるため、現在のフレームに描画するオブジェクト、カメラが見ている場所、再生するアニメーションを決定します。 グラフィックカードは、ピクセルのレンダリングに関連するすべての複雑な作業を行う「主力製品」です。そのため、別の専用デバイスです。

CPUとグラフィックカードの両方で計算の速度または量に制限があることがわかりますが、これらは異なる種類の制限です。

一般的に、CPUは作業のそれ自身の部分にもっと興味があります。合計で何個のオブジェクトを描画する必要がありますか? これらのオブジェクトはどれほど違いますか?それは100個の同一のライトですか、それとも100個の茂み/植物/木ですか? これらのオブジェクトはアニメーション化されていますか、動的に動いていますか?静的または動いていないものはどれですか?

負荷をできるだけ減らすために最初に行うことは、画面に表示されているものだけを描画することです。 これは明らかなようですが、実装には注意深い作業が必要です。 各フレームを最初から作成することを忘れないでください。したがって、各フレームで各オブジェクトを見て、それが表示されているかどうかを判断する必要があります。 これは、すべてのゲームでプレーヤーの後ろに黒い隙間があり、彼がオブジェクトや人を見ない場合、それらは存在しなくなることを意味します。


このアニメーションでは、カメラを回転させて、プレーヤーの背後の空虚さを示します。 注意深い視聴者は、それが完全に空ではないことに気付くでしょう...

この場合、実用的なルールを作成することは困難ですが、一般に、スペースの不足を心配することなく、シーンに約1000個のオブジェクトを描画できます。 ただし、5,000個のオブジェクトをレンダリングする必要がある場合は、トリックの使用を検討する必要があります。 プレーヤーがカメラを制御できるほとんどのゲームでは、どの角度から見るかわからないので、操作のためにスペースを節約する必要があることを忘れないでください。

受け入れ可能なリソースをほぼ完全に使用できるようにする多くのトリックがあり、それらはウォッチドッグのようなゲームで特に重要です。 境界線に近づくほど、また同じ数のオブジェクトから得られる視覚的品質が高いほど、ゲームの見栄えは良くなります。

たとえシーンの前にあるものを見ても、これは都市全体を描く必要があるという意味ではありません。 左右に巨大な建物がある場合、その背後にあるものはすべて見えなくなるため、描画できません。 同様に、遠くにあるいくつかのオブジェクトは非常に小さくなるため、遠くに小さな植物や低木を描くことを心配する必要はありません。


このアニメーションは、私たちが見ているものよりもさらに通りを歩いた場合、脇道には何もありませんが、遠くでは細部が小さくなることを示しています。

実際、このシーンにはまだ多くのオブジェクトがあり、結果として不可視になります。 この分野ではまだ多くの研究が必要であり、さまざまな高度な技術を適用する必要があります。 常に妥協する必要がありますが、少し時間を費やしたり、100個のオブジェクトをほとんど余分な労力をかけずにレンダリングすることを回避するための非常にスマートな方法を考え出せば、シーンをさらに複雑または高密度にすることができます。

また、別の小さな問題があります。 場合によっては、画面にほとんど見えず、それをはるかに超える建物を描く必要があります。 リソースを無駄にします。 これらのオブジェクトはいつでも複数の部分に分割でき、各部分を描画またはスキップできます。つまり、無駄が少なくなります。 ただし、画面に表示されるオブジェクトの総数が増え、逆の問題が発生しました!

この例は数百の例の1つですが、どの決定を下す必要があるか、各ゲームの理想的な平衡点を見つけるためにどの実験を行うべきかを説明するのは簡単です。

ウォッチドッグスからのショットのアクションは都市で行われるため、上から見て、正確に何が描かれているかをほぼ理解することができます。 この静的な図では、Watch Dogsが四半期ごとに作業を行っていることが特に顕著です。


次に、カメラの前に表示される領域を表示するために離れます(時間を節約するためにインストールをご容赦ください)。


おおよそのカメラの可視性が画像に重畳されます。 この三角形の幅は視野に依存します-ゲームではこれはカスタムオプションであり、一定値であることがあります。


これがシーンのワイヤーフレーム表示です。カメラの視野は白に制限されています。



ある人は、特定の数のオブジェクトのレンダリングの制限を回避するための小さなトリックをすでに考えているかもしれません-オブジェクトを個々のリーフに至るまで、小さなエリア内のすべての非常に複雑な組み合わせにしてみませんか? その後、1000個のオブジェクトを描画するだけで十分です。

しかし、ここでは完全に異なる制限のセットに直面しています-グラフィックカードのパフォーマンスは制限されており、オブジェクトが複雑になるほど描画に時間がかかります。 つまり、1つのオブジェクトであっても、それが非常に複雑な場合、ゲームのフレームレートを20 FPSに下げることができます。 これを含めると、オブジェクトの数の制限はかなり曖昧だと私が言ったのです。

オブジェクトに費やされる時間は、モデルとテクスチャの複雑さと粒度、および照明と影の洗練度に依存します。 これは、より複雑または洗練されたグラフィックスを実装しようとするゲームがそれほど複雑で詳細なシーンを使用しない傾向がある理由でもあります-バランスはスケールをある方向または別の方向にシフトします。


これは、シーンのどの部分に特に複雑なモデルがあるかを示す一種のヒートマップです。 木や植生が引き起こす問題の数に注目してください。

このような問題を解決するために特別に設計された詳細レベル(LOD)と呼ばれる別の技術セットがあります。 オブジェクトの数を最適化し、不要なものをすべてカットできるという事実と同様に、不要なものを排除して「複雑さ」の供給を増やすことができます。

トリックの1つは実際によく知られています-これはテクスチャの解像度を変更します。 通常、このトピックは他の多くのトピックと交差するため、アクセス可能な方法で説明するようにします。

ゲームのテクスチャは、通常、2の累乗に等しいサイズの長方形です-512、1024、2048、4096 。

以下で説明する理由により、テクスチャにはあらゆる種類の小さなバージョンが常に必要です。 つまり、サイズが1024x1024のテクスチャには、サイズが512x512、256x256、128x128、64x64、32x32、16x16、8x8、4x4、2x2、1x1の小さいバージョンがあります。 ただし、これの利点の1つは、画面上の遠くのオブジェクトが小さい場合、1024x1024のテクスチャを適用するとリソースが無駄になることです。 同じテクスチャーの小さいバージョンを使用することで節約できます。

同様に、近くのオブジェクトであってもあまり重要ではないと見なすことができ、それらにより小さいテクスチャを使用します。

ご注意


通常、プレイヤーがオブジェクトに近づくと、最大のテクスチャが使用されますが、ほとんどの人が特定のゲームで見たように、これは常に発生するわけではなく、ロードする前にテクスチャがぼやけすぎます。 これは通常、レンダリングのためにテクスチャをDVDまたはハードドライブからグラフィックカードのメモリに直接ロードできないために発生します。 ほとんどの場合、これは、プレイヤーが突然自分の位置を変更したとき、例えば、リスポーン、新しいレベルのロード、または非常に速い動きのときに起こります。 他のすべての場合、通常、プレーヤーは世界中を移動する過程でテクスチャが徐々にロードされます。

この単純化プロセスをゲームで使用されるモデルに適用することもできますが、それははるかに困難です。 複雑なオブジェクトの単純化されたバージョンを作成することで、遠く離れた場所で、限られた複雑さの一部を食い尽くさないようにすることができます。

単純化されたオブジェクトとトリミングされたモデルのおかげで、多くのお金を節約でき、Watch Dogsなどのゲームでこのアプローチを使用する必要があります。しかし同時に、それは膨大なリソースの浪費になる可能性があります。モデルの単純化されたバージョンがいくつ必要になるかについて、非常に思慮深くバランスの取れた決定を下す必要があります。それらの数が少なすぎると、あまり多くを保存できなくなるか、それらを変更したときに品質が大幅に向上します。それらが多すぎる場合、メモリを浪費し、オブジェクトの作成に必要な工数を費やします。


これは、非常に詳細なバージョンと見分けがつかない場合に、複雑なオブジェクトやキャラクターが遠くを見る方法です。



グラフィックプログラマー、アーティスト、レベルデザイナーが、最高品質のグラフィックスと高速を組み合わせようとしている問題について、ある程度理解していただけたことを願っています。コンソールでは、機器が一定であるため、この方程式はPCよりも簡単に解決できます。

前の部分で、反射やその他の類似したものを正しく実装することが非常に難しい理由についてお話します。その理由は非常に単純です-私が常に話し続けている生産性とリソースの埋蔵量は、リフレクションがあるかどうかによって変わりません。シーン全体を再び表示できるリフレクションを作成する場合は、説明したすべての作業をやり直す必要があります。さらに、反射はそれらを見る角度に大きく依存するため、各反射オブジェクトの正確な反射を得るには、それらは独自のものでなければなりません!

これは非常に迅速に制御不能になる可能性があり、通常、リフレクションが存在するゲームでは、特定の自由または仮定が許可されます。ゲームが複雑な環境で反射を作成することはほとんどありません。最大数は、オブジェクトがあまりないバスルームの鏡です。シーンの複雑さは小さいため、追加費用を支払うことができます。おそらく、ゲームの本当の反射は、水面の不均一または波状の表面にのみ存在するため、非常にラフで詳細度の低いシーンでも説得力のある反射を作成するには十分です。

通常、反射面を完全に回避することは困難です。そのため、ゲームでは、直前の環境の事前にレンダリングされた画像を使用するため、「かなり良い」結果が得られます。しかし、それらは綿密な精査に耐えられず、反射をよく見ると、これは模倣であることがわかります。特定の条件で反射を作成するのに役立つ最新のテクニックがあり、後で説明することもありますが、そのような事前レンダリングされた(「事前レンダリングされた」)イメージは依然として必要です。


このレンダリングされた画像は「キューブマップ」と呼ばれます。アイデンが立っている場所に関しては完全に正確ではありませんが、彼に十分近いです。

ウォッチドッグスは、反射をリアルタイムでレンダリングします。私はこの問題を詳細に調査しませんでしたが、キャラクターが路上にいるときは常にレンダリングされ、主に彼が座っている車で彼の正確な反射を取得し、イメージを改善し、彼にわずかな現実感を与えるために使用されると信じています。プレイヤーは常に自分の車と彼の身近な環境に集中しているため、他の車に誤った反射があるという事実はほとんど目立ちません。

これらの反射のレンダリングを高速化するために利用できる多くの近似があります。たとえば、実際のシーンよりもはるかに少ないオブジェクトがリフレクションでレンダリングされます(約350のみ)。それらの多くは、フルバージョンと比較して非常に単純化されています。人などの複雑なオブジェクトは、距離に関係なく完全に破棄されると思いますが、この理論はテストしていません。さらに、これらのオブジェクトには影がなく、照明は非常に単純です-太陽と空から来るものだけです。反射は「魚眼」レンズのように地面からレンダリングされます。つまり、地球自体の反射は不可能であり、その隣にあるものは非常に詳細度が低くなります。

しかし、これらすべての単純化を行ったとしても、反射は意図したもののみに対処します。レールの下を運転すると、車の景色を眺めながら正しい反射を得ることができますが、実際にはうまくいきません。

この決定は意図的であり、容易ではありません。在庫は一定の値であるため、これらの反射の余地を残す場合は、他のものを犠牲にする必要があります。


これは、反射のために作成された、底面図でのアイデン周辺のシーンの非常に「魚っぽい」ビューです。列車の2つのライトとレールに沿って移動できます。



ここで言及したい仕事の別の部分があります-影。これは興味深いトピックであるため、後でシャドウの仕組みについてお話しますが、今最も重要なことは、シャドウが反射に非常に似ていることを覚えておくことです。影を落とす各光源は、その視点からシーン画像をレンダリングする必要があります。今回は、作業を単純化する方法はあまりありません。影を正しく計算するには、各光源にこの画像が必要です。

ご注意


, . , ÂŤÂť , . , , .

影を与える照明の最も明白で最も重要な光源は、太陽(または夜間に発生する場合は月)です。太陽は非常に大きいため、ヘッドライトや懐中電灯の場合のように、通常は1つではなく3〜5つの画像がレンダリングされます。

残念ながら、これはウォッチドッグが良い例として役に立たない場合の一つです。ゲームでの影の計算は非常に複雑で、私には、街で影を落とす場合に特別に最適化されているようです。したがって、ファークライ4に切り替えて、このゲームのフレームの例での影の計算を検討した方がよいでしょう。


これは、私が例として使用しているFar Cry 4のシーンです。


これは、このシーンの影に関する情報を含む画像です。それぞれの影には、シーンの完全に新しいレンダリングが必要です。

したがって、光源に影付けを追加する必要がある場合、シーンをもう一度レンダリングする必要があります。ここでは、反射の場合に使用されるいくつかの近似を使用することもできますが、それらははるかに小さいものです。小さいオブジェクトや遠くのオブジェクトはスキップできますが、これらのオブジェクトは影を落として見えないことに注意してください。イメージを非常に小さくレンダリングできますが、シャドウは粒子が粗く、詳細度が低くなります。通常、オブジェクトの非常に簡略化されたバージョンを使用することはできません。オブジェクトがそれ自体に影を落としているように見えるか、オブジェクトとその影の間に隙間が生じるためです。

見逃しやすいもう1つの結果は、各光源のシェーディングイメージを作成する必要があることです。多くの場合、光源を組み合わせることで光源を単純化することが可能です-ウォッチドッグでは、これは車のヘッドライトで起こります。

両方のライトがオンの場合、1つの光源のみが描画されますが、2つの光線のように見えるため、特殊な形状を持っています。ヘッドライトに影がある場合、これはそれほど単純ではなく、はるかに目立ちます-プレイヤーが車の前を通過すると、ライトは2つのヘッドライトの間のどこかから来ます。おそらく、ヘッドライトを分離する必要がありますが、同時に、影の計算に追加のコストがかかるだけでなく、新しい照明を描画する必要があります。



私が強調したかった主なものは、これらすべてです。これらすべての近似値を確実に取り除くことができますが、リソースの予備をこれに費やす必要があります。つまり、何か他のものを犠牲にしなければなりません。各ゲーム開発者は、彼がゲームに集中することが何が重要で、何がプレイヤーを最も感動させるか、またはイライラさせるかを決定する必要があります。

パート4.ピークの移動


このパートでは、シーン内のオブジェクトをアニメーション化する技術的な詳細について説明します。

グラフィックプログラマは、グラフィックパイプラインについてよく話します。 3Dグラフィックスは、あるステージから別のステージへの明確に定義された動きを備えた組立ラインのようなものですが、一度に1つのオブジェクトだけでは機能しません。

最新のグラフィックスカードはすべて、ほぼ同じコンベヤベルトを備えており、コンベヤの速度を最大化するために「シリコン」で直接フラッシュされる特別な機器とソフトウェアを備えています。もちろん、メーカーやグラフィックスカードのファミリにはさまざまなバリエーションがありますが、通常、このレベルでどのように機能するかを心配する必要はありません。

ご注意


すべてが抽象的なハードウェアレベルでどのように機能するかに興味がある場合は、グラフィックスパイプラインに関するFabian Giesenの一連の記事をお勧めします。記事のこのシリーズはずっとあり、より詳細で私のポストよりもはるかに優れ理解する必要があります。

興味深い重要な原則を説明するために、多くの詳細をスキップします。この部分では、パイプラインの最初の部分、つまり頂点シェーダーと呼ばれる部分を見ていきます。

シェーダーは、頂点シェーダーとピクセルシェーダーが登場したDirectX 9のリリース後、約16年前に普及しました。シェーダーとは何かを説明し、以前のシェーダーと比較するために、シェーダーが行う作業について説明します。


エイデンのスケルトンヘッドが再び登場します。

パート2では、ゲームワールドの作成元のモデルについて検討したことを思い出してください。これらのパターンは、三角形で接続された頂点と呼ばれる個々のポイントで構成されています。それらについては後で詳しく説明すると言いましたが、今は約束を守ります。

ゲームの世界ではすべてが頂点で構成されているため、これらのモデルで行う必要のあるすべてのことを頂点で実行する必要があります。グラフィックスカードに関しては、頂点の長いリストのみが表示されます。彼女にとって、アニメーションの実行、木の葉の揺れ、またはその他の抽象的な概念などはありません。

私たちがしなければならないことの簡単な例を見てみましょう-世界でオブジェクトを移動し、配置します。手始めに、キャラクターではなく単純なケースを取り上げてください。

Mayaや3D Studio Maxのような3Dエディターでオブジェクトを作成する場合、アーティストは常に独自の別々の世界から構築します。これらのオブジェクトは、シカゴの側近ですぐには作成されませんが、その周囲は、マトリックスの「空の白い部屋」に似ています。各オブジェクトは、絶対的な空虚の中心に位置しています。


これはゲーム内のレールの下の信号機で、独自の世界にあります。

ディスクに保存するとき、モデルは世界のどこにあるのか、いつダウンロードされてグラフィックカードに転送されるのかがわかりません。つまり、オブジェクトを描画するときが来たら、オブジェクトを自分の世界から描画するシーンに移動する必要があります。これはレンダリングされた各オブジェクトで発生し、建物や橋などの動きのないオブジェクトでさえ、各フレームの独自の世界からシーンに移動します。


ここでは、いくつかの信号機が部分的に構築された最終シーンに既に配置されています。

上で述べたように、作業できるのはピークのみです。グラフィックカードに「橋の下にこの信号機を置いてもらえますか?そして、さらにもう1つ追加しますか? !エクセレント"

だから、代わりにそれはオブジェクト自体で行う必要があるとグラフィックスカードを言って、私たちはその頂点の全てをどうするか、と言っています。この場合、すべてが非常にシンプルになります。すべての頂点をまったく同じ方法で変更し、互いに対して静止している場合、これはオブジェクト全体を移動することに似ています。行う必要があるのは、「変更」が変換と呼ばれるものを把握することだけです。

ご注意


, . , , , — .

頂点シェーダーが表示される前は、グラフィックスカードの頂点を変換するための可能なオプションは非常に限られていた。オブジェクトの移動と回転、およびその他の操作が利用できましたが、特に冗長または複雑なものはありませんでした。

頂点シェーダーは、グラフィックカードで実行される小さなコンピュータープログラムです。彼らは1つの頂点を取り、それで必要なアクションを実行し、出力頂点を発行します。彼らはそれを動かすだけでなく、彼らを上下にジャンプさせたり、最も近いピークから遠ざけたり、風に応じてスイングさせたり、アニメーション化したりすることができます。

Watch Dogsで使用されている頂点シェーダーの1つを取り、それを少し実験して、その機能を示しました。これは非常に骨の折れる仕事ですが、キャラクターに使用されている頂点シェーダーを見つけて変更しました。顔や手などの肌に使用される別の頂点シェーダーがありますが、原理はすぐに理解できます。


キャラクターモデルにベンドを追加する非常に簡単な変更を加えましたが、他のすべては通常どおり使用されます。

上記のアニメーションは、キャラクターが何らかの形で奇妙に歪んでいることを示しています。これにより、「各頂点を移動する場合、オブジェクト全体を移動することに似ています」という原則に戻ります。頂点シェーダーに加えられた変更は、一度に1つの頂点に対してのみ機能しますが、すべて同じ歪みで機能するため、効果はオブジェクト全体に適用されます。

また、変換の一部に変更を加えることもできます。この部分は、「所定の位置に移動する」だけで、キャラクターを正しい場所に配置する代わりに、地面の上に持ち上げます。これは物理学の助けを借りてシミュレートされていないため、重力や他のオブジェクトとの衝突とは関係ありません。必要に応じて、全員を空中に浮かせることができます。


このアニメーションでは、頂点シェーダーでオブジェクトを徐々に上げ下げします。

明らかに、これはあまり建設的ではありませんが、頂点シェーダーがどのように機能するかについての一般的なアイデアを提供します-木の葉を揺らすようにアニメーション化する場合は、同じことを行います。上げ下げする代わりに、彼らは風の方向にスイングします。その後、風の強さを変更して、木が多少揺れるようにします。


ここでは、すべてが約7倍に増加するとどうなるかを確認します。

少し簡略化しますが、基本的にほとんどの頂点シェーダーのタスクは「オブジェクトを所定の位置に移動する」ことです。例外は、アニメーション化されたすべてのオブジェクト-人物、動物、スイングロープ、はためく服などのオブジェクトです。



人のアニメーションは、スケルトンと「スキン」を使用するというアイデアに関連しています。スケルトンは、動くキャラクターの簡単な説明です。この段階では、アニメーション化されていないバックル、帽子、ジーンズは気にしません。人間の骨格に最も関連する重要な動きのみが重要です。


人物の単純なスケルトンがここに示されています。 スケルトンは3Dエディターの外で視覚化するのが難しいため、Watch Dogsから取得したものではありません。

Attribution-ShareAlike CC BY-SAによってライセンス供与された画像© MakeHuman team 2001-2014


これは、アニメーションを使用せずにキャラクターがどのように見えるかを示すスナップポーズまたはTポーズです。

アニメーション-ランニング、ウォーキング、ジャンプ-は、このスケルトンにのみ適用されます。 これにより、数千や数千の頂点ではなく、約100のボーンのみを考慮する必要があるため、プロセス全体が非常に単純になります。

スケルトンを作成した後、各頂点はこの静的な位置で1つ以上のボーンにアタッチされ、この接続は「スキニング」と呼ばれます。 Half-Life 1の時点で、このテクノロジーが使用され始めたとき、各頂点は1つのボーンのみに関連付けられていました。 最近では、4つのボーンを結合することもできますが、各ボーンには重みが与えられます。重みは、頂点へのボーンの影響の度合いに依存します。 これにより、よりスムーズなアニメーションが得られ、腕や脚を動かすときに鋭角を作成することなく、異なる領域でボーンを交差させることができます。


これは、大腿骨が回転した上記のスケルトンです。 色は、モデルの上部に対するヒップボーンの重量を示します。

Attribution-ShareAlike CC BY-SAによってライセンス供与された画像© MakeHuman team 2001-2014

この技術には、特に、肘や肩などのヒンジで衣服や皮膚が圧縮されたり伸びたりする場所に制限があります。 これは不完全ですが、アニメーション化するための非常に効果的な方法です。 最も深刻な制限は、この方法で説得力のある顔のアニメーションを作成することは非常に難しいということです。 たとえば、眉や口の周りなど、顔にたくさんの「フェイク」ボーンを作成できますが、これは筋肉と肌の大まかな近似にすぎません。

この手法のもう1つの重要な機能は、頂点とボーンの比較が非常に具体的であり、この比較の実行方法に関連していることです。 いくつかの異なるモデルにアニメーションを使用することは可能ですが、スケルトンを使用する個々のモデルはそれぞれボーンに関連付けられている必要があります。 その理由は、アニメーションが頂点をスケルトンに対して元の位置から移動させるためです。 頂点が予想される位置にない場合、問題が発生します。


モデルが彼女が使用するスケルトンと一致しない場合、アニメーションは完全に不正確になります。


キャラクターの幅を2倍にすると、 Drakeの「過食ドーナツ」に似た効果が得られますが、ブラシに近いアニメーションが元の位置から最も離れているため、不正確になることがわかります。

最初のアニメーションは奇妙に見えるかもしれません-このようなグリッチアニメーションは、ゲームで非常に頻繁に発生します。 通常、それらは、誤ったアニメーションがスケルトンに適用されるか、モデルが間違ったスケルトンを使用するという事実によって引き起こされます。 テクスチャとモデルの場合のように、スケルトン、スキニング、モデルを非常に慎重に比較する必要があります。そうしないと、結果がすぐに悲しくなることがわかります。

頂点シェーダーの目的についてある程度のアイデアを得て、静的モデルを生きたキャラクターに変えるためにアニメーションがどのように使用されるかを理解してください。

Source: https://habr.com/ru/post/J430930/


All Articles