macOSでOpenGLプログラミング（1-10. OpenGLの環境を確認する）

[macOSでOpenGLプログラミングの目次に戻る](http://qiita.com/sazameki/items/d060f20f621c658046d9)

# はじめに

[前回](https://qiita.com/sazameki/items/68baa657b2f6488f7704)までで、OpenGLのゲームループを作成し、C++でゲーム処理を書くクラスを用意し、キーボードとマウスの操作ができるようになりました。

ここでOpenGLの環境を確認するコードを書いてみたいと思います。シェーダを書き進めていくと、

- OpenGLやGLSLのバージョンが実際にはいくつ？
- 同時に利用可能なテクスチャの枚数は何枚？
- インデックス・リストで利用可能な頂点数は？

といった疑問が湧いてきますので、今回はそれを確認してみましょう。


# 1. OpenGLとGLSLのバージョンを確認する

MyGLView.mmを編集して、`prepareOpenGL`メソッドの先頭に、これらの情報を確認するコードを書きましょう。まずはOpenGLのバージョンと、GLSLのバージョンを取得して表示するためのコードです。

```objc++:MyGLView.mm（一部）
- (void)prepareOpenGL
{
    [super prepareOpenGL];

    const GLubyte *glVersion = glGetString(GL_VERSION);
    const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
    printf("OpenGL Version: %s\n", glVersion);
    printf("GLSL Version: %s\n", glslVersion);

    /* 以下、省略 */
}
```

OpenGLの基本的な情報は、このように`glGetString()`関数を使って、文字列情報として取得できます。

筆者の環境では、Mac Pro (Late 2013)では、

```
OpenGL Version: 4.1 ATI-1.51.8
GLSL Version: 4.10
```

と表示されます。MacBook Pro (Retina, Mid 2012)では、

```
OpenGL Version: 4.1 NVIDIA-10.17.5 355.10.05.45f01
GLSL Version: 4.10
```

でした。どちらも、OpenGLとGLSLのバージョンが一致していることが分かります。なお、OpenGL 3.3以降は、OpenGLのバージョンとGLSLのバージョンが一致するようになっていますので、当然の結果なのですが、やはり一度はこうして確認しておきたいところです。


# 2. テクスチャのユニット個数と最大サイズを確認する

次に、テクスチャを同時に何個利用できるかと、どれだけの大きさのテクスチャが利用できるかを確認しましょう。これらの情報は、`glGetIntegerv()`関数を使って、引数に`GL_MAX_TEXTURE_IMAGE_UNITS`および`GL_MAX_TEXTURE_SIZE`という定数を渡すことで取得できます。先程のコードの下に、次のコードを追加します。

```objc++:MyGLView.mm（一部）
    GLint maxTextureUnits, maxTextureSize;
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
    printf("Max Texture Units: %d\n", maxTextureUnits);
    printf("Max Texture Size (width/height): %d\n", maxTextureSize);
```

筆者の環境 (Mac Pro (Late 2013)およびMacBook Pro (Retina, Mid 2012)) では、

```
Max Texture Units: 16
Max Texture Size (width/height): 16384
```

と表示されましたので、シェーダ上でのテクスチャの同時利用可能枚数が16枚、テクスチャの最大横幅と縦幅が16384ピクセルということが確認できます。


# 3. インデックス・リスト関係の情報を確認する

さらに次のコードを追加して、`glDrawElements()`関数でインデックス・リストを使って描画する時に、最大で何個の頂点データを使用して、最大でいくつのインデックスを同時に描画できるのかを確認します。

```objc++:MyGLView.mm（一部）
    GLint maxIndexListVertices, maxIndexListCount;
    glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxIndexListVertices);
    glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &maxIndexListCount);
    printf("Max IndexList Vertices: %d\n", maxIndexListVertices);
    printf("Max IndexList Count: %d\n", maxIndexListCount);
```

筆者の環境では、

```
Max IndexList Vertices: 1048575
Max IndexList Count: 150000
```

と表示されました。ちなみに、Mac Pro (Late 2013) (GPU: AMD FirePro D700 6144 MB) でも MacBook Pro (Retina, Mid 2012) (NVIDIA GeForce GT 650M 1024 MB, Intel HD Graphics 4000 1536 MB)でも、同じ結果でした。頂点数が104万8575個、インデックス数が15万個のようです。

なお、Unity用に配布されているユニティちゃんのFBXデータでは、頂点数がおよそ5万程度ですので、それと比較するとだいたいの規模の想像できるかと思います。


ここまでのプロジェクト：[MyGLGame_step1-10.zip](http://sazameki.jp/temp/MyGLGame_step1-10.zip)


# 4. まとめ

今回は、OpenGLの環境を確認するための各種のクエリ情報を確認してみました。Mac上のOpenGLの、おおよその描画性能が確認できたと思います。

次回からはいよいよ2章に突入です。シェーダを書いて、グラフィック描画の勉強をしていきましょう！

---
次の記事：[macOSでOpenGLプログラミング（2-1. シェーダを書いて三角形を表示する）](https://qiita.com/sazameki/items/e60848466f7016e48b14)