前回の続き。
まず、分かったのは、こまめに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