IntelグラボとOpenGLの苦悩 その2

シェーダーを使う状況かつVertexBufferObject(VBO)を使ってということを前提条件とします。
このとき、glEnableVertexAttribArray, glVertexAttribPointer等を使って、
頂点ストリームを設定していくのが自然です。しかしながら今回、これでトラブルに見舞われました。

GL_ARB_vertex_program の仕様をOpenGL Registryで調べると、
各頂点属性のindex値は、頂点データのセマンティクスにより決まるように書いてあります。
今までは、この値を参考にしながら glEnableVertexAttribArray( index ); を設定していました。

そのようにして実装した結果、NVIDIA, Intel のグラフィックチップによる描画では
問題が起こらなかったのですが、AMD(ATI)のチップでは、位置情報以外設定されない!という動作結果が出てしまいました。

もともとはIntelの場合を想定して、この作業を行っていたのに、
意外にもAMDでまともに動作しないという状況ではちょっと不味い…。

GLSLを使える状況、すなわち、GL_ARB_vertex_shaderの拡張でシェーダーを使う分には、
従来方式で問題はおこりません。今回~programのほうなので問題があるわけです。
この~programは、いわゆるシェーダーアセンブラへOpenGLが対応したときの拡張です。

おおまかな出現順から考えると、

  1. GL_ARB_vertex_program, fragment_program
  2. GL_ARB_vertex_buffer_object
  3. GL_ARB_vertex_shader

という順序なので、VBOとの同時使用で問題が引き起こされている感もありそうです。

  • VBOを使用せずに、頂点データを直接VertexAttribPointerで設定した
    • NG. 動作せず。
  • VBO使用して、glVertexPointer等でオフセットを指定した
    • OK. AMDで動作した。

こんな結果になりました。
もう古いAPIである glVertexPonterやglColorPointer等で、VBO内のオフセットを設定してあげることにより、
シェーダーアセンブラ使用時でも、頂点属性をシェーダー側へ流し込むことが出来ました。

※ なるべくならこんな古いAPIを使いたくはなかったんですが…。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする