IntelチップでopenFrameworksのアドオンofxMltMapping2Dを使ったときのメモ

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ノートPC(Mobile Intel 4 Series Express Chipset Family)でofxMltMapping2Dを使ったプロジェクションマッピングプのサンプルを作成したときのメモです。
※ ハマった所が中心です。

そもそもopenFrameworksを動かす人はちゃんとグラボの入ったPCを使うと思うので、このメモはほとんど役に立ちません(笑)

環境

以下の環境で動かしています。

  • PC:Acer Aspire 1410

  • GPU:Mobile Intel 4 Series Express Chipset Family

  • OS:Windows 7 SP1 64bit

  • 開発環境:Microsoft Visual Studio Express 2012

ハマった所

FBOが作れない

ofFboのallocate関数でExceptionが発生し、プログラムが落ちてました。glGenFramebuffersを実行する時です。
いろいろと調べた結果、IntelチップではFramebuffer ObjectのExtentionの名前がGL_EXT_framebuffer_objectになっているということが分かりました。
ちなみに、NVIDIA系のグラボだとFramebuffer ObjectのExtention名はGL_ARB_framebuffer_objectです。
※ OpenGL周りのドライバ実装が古いんですかね?

これがどのような影響を及ぼすのかというと、ドライバからロードするFBO関連の関数名が変わってしまいます。具体的には、末尾に"EXT"が付きます。

glew.hにはEXTが付いている関数ポインタも宣言されているので問題ないのですが、ofFbo.cpp内のコードはすべてEXTが付いていないものになっています。
ですので、ビルドが通っていざ実行、、というときに関数がロードできなくてエラーになるわけです。

ということで、力技で関数名を変える修正を行いました(だって時間がなかったんだもの…)。

  • glGenFramebuffers -> glGenFramebuffersEXT

  • glBindFramebuffer -> glBindFramebufferEXT

  • glGenRenderbuffers -> glGenRenderbuffersEXT

  • glBindRenderbuffer -> glBindRenderbufferEXT

  • glRenderbufferStorage -> glRenderbufferStorageEXT

  • glFramebufferRenderbuffer -> glFramebufferRenderbufferEXT

  • glFramebufferTexture2D -> glFramebufferTexture2DEXT

  • glCheckFramebufferStatus -> glCheckFramebufferStatusEXT

  • glDeleteFramebuffers -> glDeleteFramebuffersEXT

VBOでも似たような問題が発生

以下の修正を行いました。

  • glewIsSupported("GL_ARB_vertex_array_object") -> glewIsSupported("GL_EXT_vertex_array_object")
マッピング用のポリゴンを生成する際、ポイント数を変えるとプログラムが落ちる

いきなりofxMltMapping2Dの話になります。
無事にビルドが通ってプログラムを実行し、マッピング用の2Dポリゴン(ポイント数を増やせるもの)を生成->ポイント数を変更とするとプログラムが落ちました。

落ちた箇所はshapes\ofxMtlMapping2DPolygon.cppの以下の部分です。

ofxMltMapping2DPolygon.cpp

        for (int i=2; i <= 3; i++) {
            for (it=vertices.end(); it!=vertices.begin(); it--) {
                ofxMtlMapping2DVertex* vertex = *it;

                if (vertex->bIsOnAnEdge && vertex->edgeIndex == i) {
                    // We check this for the grids, so that we don't add the vertices forming the interior of the grid
                    polyline->addVertex(vertex->center.x, vertex->center.y);
                }
            }
        }

イテレータitをvertices.endから始めているため、最初の*itへの参照時にアクセスエラーとなります。なので、取り合えず

ofxMltMapping2DPolygon.cpp(修正)
for (it=vertices.end(), it--; it!=vertices.begin(); it--) {

として回避しました。やっつけですが、落ちなくはなりました。
※ バグならちゃんとした修正入れてプルリクしろって話になりますが。。

おわり

他はすんなり行けましたー