[macOS][OpenGL]OpenGLに再挑戦（其の弐）

<p>前回の続き。</p>

<p>まず、分かったのは、こまめにglGetError()でエラーが発生しているのか確認すること。その結果、glVertexPointer()の呼び出しで、GL_INVALID_ENUM が発生していることが分かった。</p>

<p>そして、OpenGLのバージョンが2.1だったのが、以下の設定で4.1になることが分かった。設定してしまうと、古いAPIが使えなくなるので、一旦、見送るが。</p>

<pre><code>glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_3_2_CORE_PROFILE);
</code></pre>

<p>エラーの内容から、バッファオブジェクトを使用しない方法だったが、使用する方法でないと弾かれるのではと考え、試してみることにした。</p>

<pre><code>GLuint  bufferID;
 
void init(void)
{
    assert(glGetError() == GL_NO_ERROR);

    /* ディザ処理を無効にする */
    glDisable(GL_DITHER);
    assert(glGetError() == GL_NO_ERROR);
    
    std::string ver((const char*)glGetString(GL_VERSION));
    assert(! ver.empty());
    std::istringstream verStream(ver);
    
    int major, minor;
    char dummySep;
    verStream >> major >> dummySep >> minor;
    const bool useVertexArrays = ((major >= 1) && (minor >= 1));
    NSLog(@"OpenGL Ver. %d.%d", major, minor);
    
    /* 三角形の頂点を定義する */
    const GLfloat data[] = {
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f
    };
    
    if (useVertexArrays) {
        /* バッファIDを取得する */
        glGenBuffers(1, &bufferID);
        
        /* バッファオブジェクトをバインドする */
        glBindBuffer(GL_ARRAY_BUFFER, bufferID);
        
        /* 配列の値をバッファオブジェクトにコピーする */
        glBufferData(GL_ARRAY_BUFFER, 3 * 3 * sizeof(GLfloat), data, GL_STATIC_DRAW);
        
        glEnableClientState(GL_VERTEX_ARRAY);
        assert(glGetError() == GL_NO_ERROR);
        
        glVertexPointer(3, GL_FLAT, 0, bufferObjectPtr(0));
        
        GLenum glErrorCode = glGetError();
        NSLog(@"%s (error code:0x%x)", __func__, glErrorCode);
        assert(glErrorCode == GL_NO_ERROR);
    }
    assert(glGetError() == GL_NO_ERROR);
    
    /* ディスプレイリストを作成する。 */
    gListID = glGenLists(1);
    glNewList(gListID, GL_COMPILE);
    assert(glGetError() == GL_NO_ERROR);

    if (useVertexArrays) {
        glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &gListID);
    }
    else {
        glBegin(GL_TRIANGLES);
        glVertex3fv(&data[0]);
        glVertex3fv(&data[3]);
        glVertex3fv(&data[6]);
        glEnd();
    }
    assert(glGetError() == GL_NO_ERROR);
    
    glEndList();
    
    //NSLog(@"%s (error code:0x%x)", __func__, glGetError());
    assert(glGetError() == GL_NO_ERROR);
    
    /* 描画 */
    glutDisplayFunc(display);

    /* リサイズ処理 */
    glutReshapeFunc(resize);
    
    /* キーボード */
    glutKeyboardFunc(keyboard);
    
    /* 特殊キー */
    glutSpecialFunc(special);
    
    /* マウス */
    glutMouseFunc(mouse);
    
    /* ドラッグ */
    glutMotionFunc(motion);
    
    /* バックグランド処理 */
    glutIdleFunc(idle);
    
    /* コンテキスト・メニュー */
    glutCreateMenu(main_menu_callback);
    glutAddMenuEntry("Quit", QUIT_VALUE);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
}
</code></pre>

<p>ダメだ。やはり、glVertexPointer() を呼んだ後にエラーだ。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/IRIS">https://github.com/murakami/workbook/tree/master/mac/IRIS</a> - GitHub<br />

関連情報
<a href="https://amazon.jp/dp/4894717212">OpenGLの神髄</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />