Posted at
CocoaDay 22

[macOS][OpenGL]OpenGLに再挑戦(其の弐)

More than 1 year has passed since last update.

前回の続き。

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

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

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_3_2_CORE_PROFILE);

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

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);
}

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

ソースコード

GitHubからどうぞ。


https://github.com/murakami/workbook/tree/master/mac/IRIS - GitHub

関連情報

OpenGLの神髄


Cocoa勉強会 BUKURO.swift (connpass)


Cocoa勉強会 BUKURO.swift (ATND)


Cocoa勉強会 BUKURO.swift (Peatix)

【Cocoa練習帳】

http://www.bitz.co.jp/weblog/


http://ameblo.jp/bitz/(ミラー・サイト)


Qiita