シェーダーを使う状況かつVertexBufferObject(VBO)を使ってということを前提条件とします。
このとき、glEnableVertexAttribArray, glVertexAttribPointer等を使って、
頂点ストリームを設定していくのが自然です。しかしながら今回、これでトラブルに見舞われました。
このとき、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が対応したときの拡張です。
おおまかな出現順から考えると、
- GL_ARB_vertex_program, fragment_program
- GL_ARB_vertex_buffer_object
- GL_ARB_vertex_shader
という順序なので、VBOとの同時使用で問題が引き起こされている感もありそうです。
- VBOを使用せずに、頂点データを直接VertexAttribPointerで設定した
- NG. 動作せず。
- VBO使用して、glVertexPointer等でオフセットを指定した
- OK. AMDで動作した。
こんな結果になりました。
もう古いAPIである glVertexPonterやglColorPointer等で、VBO内のオフセットを設定してあげることにより、
シェーダーアセンブラ使用時でも、頂点属性をシェーダー側へ流し込むことが出来ました。
※ なるべくならこんな古いAPIを使いたくはなかったんですが…。
コメント