ゲーム開発

DirectX

DirectXとは

DirectXは、Microsoftによるマルチメディア技術で、ゲームや3DCGなどのマルチメディア関連のプログラミングに用いる。

ネットゲームに必要

DirectXAPIとしての側面もあるが、ネットゲームなど高度なグラフィックスを使うWindowsゲームにおけるランタイムのように必要です。
DirextXが入っていない場合やバージョンが古い場合などは、ネットゲームが動作しないかもしれません。ゲームをインストールする前に、DirectXが入っているかを確認して、入っていない時は導入しましょう。

OpenGL

OpenGL

2D/3DグラフィックスのためのオープンなAPIWindowsで言えばDirectXと同様の技術。
最近はゲーム制作にはUnityという高度なフレームワークを使うが、それでも描画を独自に実装したいという用途は多い。
APIクロスプラットフォームであり、クロスプラットフォームOpenGL対応ツールキットGLUTを使うことで、WindowsでもLinuxでも組み込み向けでも同じように作ることが出来る。

シェーダ

シェーダとは描画に必要な計算を行う処理部のこと。
一昔前のGPUでは決まりきった処理しか出来なかったが、プログラマブルシェーダというものが生まれ、GPUでの処理内容が動的に変更できるようになった。
バーテックスシェーダは、頂点に関する処理を行う。
フラグメントシェーダは、テクスチャなどの物体の表面を綺麗にする処理を行う。
第三回_プレゼン資料(なるほど3Dグラフィック描画の仕組み).pdfを参考に執筆しました。)

シェーダって何?

シェーダ(Shader)とは、名前の通り陰をつけるもの。
平面の画像に適切に陰をつけることで、画像を立体的に見せることができる。
OpenGLのプログラムだけでは画面に絵を出すことはできない。絵を出すにはシェーダをGLSLという言語で書く必要がある。
OpenGLでは、
1.どこにモデルを描くかを命令する(OpenGL
2.そのモデルを正しい位置に、正しい色で描く(シェーダ)
3.モデルを正しい位置に表示する(バーテックスシェーダ)
4.モデルのシェーディングを行う(フラグメントシェーダ)
となる。OpenGLはCPUで動くが、それ以降のシェーダはGPUで動く。
【OpenGLでゲームを作る】シェーダって何?GLSLへの第一歩 - おもちゃラボを参考に執筆しました。)

座標変換

ローカル座標は、そのモデルの中だけで使われる相対的な座標。
ワールド座標は、全てのモデルで共通の絶対的な座標。
座標変換は以下の流れになる。

  • 1.ワールド座標変換
    • ローカル座標で管理しているものを、ワールド座標に変換する。
  • 2.ビュー座標変換
    • カメラから見た座標に変換する。
    • ビュー座標変換に必要な情報
      • 視点(カメラの位置)
      • 注視点(焦点、カメラが見ている位置)
      • カメラの角度(上はどちらなのか)
  • 3.プロジェクション座標変換
    • 2Dに変換する。透視投影と並行投影の2種類がある。
    • 透視投影は、近くのものは大きく、遠くのものは小さく変換する。
    • 並行投影は、距離に関係なく一定の大きさに変換する。
    • プロジェクション座標変換に必要な情報
      • カメラの画角(FOV、焦点距離、映す広さの事)
      • 前後の描画範囲(ニアクリップ・ファークリップ)
      • この描画範囲を視錐台という。これを設定しないと無限遠まで描画することとなって死亡してしまう。
      • 視錘台の外にあるものは描画しない。
  • 4.スクリーン座標変換
    • ディスプレイの座標に変換する。
    • スクリーン座標変換に必要な情報
      • ディスプレイの解像度

これらをGPUで全部やってくれるのかというとそうではなく、プログラム側で変換を行うための変換行列を作る必要がある。
第三回_プレゼン資料(なるほど3Dグラフィック描画の仕組み).pdfを参考に執筆しました。)

Unity

UnityはクロスプラットフォームゲームエンジンDirectXOpenGLに対応しており、BlenderPhotoshopのファイル形式にも対応している。
Ubuntu独自のユーザーインターフェースもUnityという名前だが、別物。

Unity勉強中

最近(2018.11.29)、自分はUnityについて勉強中である。スクリプトC#/monoで動いていて、コードはC#で書く必要がある。それから、無料版は大きく儲かっていない小さな企業でしか使うことができない。
だが、Unityはダウンロードだけで簡単に使えるし、上のサイトのように詳しいサイトがたくさんある。C#は僕が昔twintail(2ch専用ブラウザ)の改造の時にお世話になった言語である。
できることなら、今僕の言っている作業所で、Illustratorで仕事をやる合間に何かゲームでも作れたら良いなと思っている。
Unityはブラウザやモバイルから家庭用ゲーム機まで幅広く対応している。とても優れたゲームエンジン(ゲームのための色んな機能を提供してくれるエンジン)で、エディタは自由に拡張することができる。アニメーションなどの分野でも使われているようである。
できることなら、Unityでカードゲームを作りたい。UnityはポケモンGOなどでも使われており、最近とても流行っている。ゲーム業界のデファクトスタンダードになるのではないかと思う。

UnityではC#を使う

Unityでは、Microsoftによる.NET Frameworkの言語である、C#を使う。これは、オープンソース.NET Frameworkとしておなじみのmonoを内部で使っているからである。
C#Microsoftの公式サイトでASP.NETというWebプラットフォームに使われていたり、Windows.Formsなどでもおなじみで、.NET Coreなどのコードを見て分かる通りWindowsMicrosoft製品の内部で使われていて、VB.NETよりもJavaに近い言語として知られている。Java VMとの比較から「MS版のJava」として知られている。monoはLinuxなどのUNIX向けのオープンソース.NET Frameworkの実装。Unityではこのmonoをスクリプトを書く言語に採用している。

ゲームを開発するならDirectX/OpenGL

ゲームを開発するエンジニアになりたいのであれば、Unityだけにとどまらず、OpenGLDirectXなどの3Dグラフィックスができるようになっておこう。
最近のゲームは、全部3DCG。特にAndroid用のゲームを使うのであれば、Javaのような技術も必要。最近はRubyなどでもゲームが作れるようにはなってきている。正統派はC++OpenGLを使うが、これは3Dレンダリングの処理速度を高めるため。XboxなどのMicrosoft製品ではC#を使うこともある。一部のネットゲームではPerl/CGIなどでブラウザゲームが作られたりはしているが、3Dを行うのであればネットゲームではDirectXは必須である。

Blender

Blenderは3DCGのモデリングソフトウェア。操作は難しいが、出来ることは多い。オープンソースクロスプラットフォーム

使い方

Blenderは「操作が難しい」ことで知られ、慣れるまでは苦労する。
マウスとキーボードを使って平面・立方体・球をモデリングし、レンダリングを行う。モデリングはポリゴンとベジェ曲線の各手法が選べる。
「Blender」オープンソースで開発されている高機能な3Dモデリングソフト - 窓の杜より。)

Blenderは決して初心者に不向きではない

Blenderは「初心者には難しい」とか「使いづらい」といった意見が言われることが多いが、下のニコニコ大百科の記事がそれらを論破している。

要するに、「操作性は一貫しており理にかなっている」「無償であるため使い方を全く知らないままで使おうとするものが多い(ほかの有償の3DCGソフトも同様に難しい)」というのがその理由であるとのこと。
つまり、2DCGソフトのように適当に使っていればそのうち分かるというものではないため、「きちんと使い方を必死に勉強してから使え」ということである。決して初心者に不向きではない。

基本的操作方法

Blenderのマウス操作は、「左クリックは決定」「右クリックは頂点等の選択、キャンセル」「中央ホイールは画面の拡大、回転、移動」となる。
Blenderはキーボードショートカットを使うことを前提としており、Gは移動、Rは回転、Sは拡大縮小となる。左手を常にキーボードに乗せ、マウスによる画面回転、キーによる画面切り替えと連携して、画面を高速回転させながら、あらゆる角度から整合性を保ってモデリングを行う。
画面構成はカスタマイズできるほか、数値を直接打ち込む手法や左右対称モデリングも得意とする。Pythonスクリプトも利用できる。
Blenderとは (ブレンダーとは) - ニコニコ大百科を参考に執筆しました。)

Blenderで作った3DモデルをUnityにインポートする

Blenderで作った3Dモデルを、ゲームエンジンのUnityにインポートするには、一度[ファイル] - [エクスポート] - [FBX]でFBXにエクスポートし(出力先をUnityプロジェクトのAssets配下の任意の場所に指定)、Unityでエクスポート先のUnityプロジェクトを開く。fbxのファイル名でプレハブが増えているので、これをHierarchyビューにドラッグ・ドロップする。
Blender 2.80 で作った 3D モデルを Unity にインポートする - しっぽを追いかけてを参考に執筆しました。)

簡単な説明

Blender

ゲーム開発

  • ゲーム
    • OpenGL
      • 座標変換
        • さまざまな3Dの座標を変換する
        • ワールド座標変換
        • ビュー座標変換
        • プロジェクション座標変換
        • スクリーン座標変換
      • シェーダ
        • 描画に必要な処理を行う
        • 頂点の処理を行うバーテックスシェーダと、テクスチャの処理を行うフラグメントシェーダがある
        • シェーダとは「陰をつけるもの」という意味
        • 陰をつけることでCGを3Dに見せる
      • 画像合成
        • 3DCGの中でCGを配置したり動かしたりするためにプログラマが合成を行う
    • DirectX
    • Unity
      • さまざまなゲームが簡単に作れるゲームエンジン
      • ゲームを作るための言語としてMonoを採用しているため、C#を使ってゲームを開発する