1. m_yukio

    Posted

    m_yukio
Changes in title
+[macOS][OpenGL]OpenGLに再挑戦(其の弐)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,126 @@
+<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 />