NVIDIAとATIのGLSL対応の差

今までGPUPPURをNVIDIAのグラフィックスカードだけで開発していたので、テストのためにATIのRadeonX1650Proを取り付けてテストしてみました。
GPUPPURではあまり複雑なシェーダを使ってなかったので問題無く動きましたが他のプログラムでGLSL関連のエラーがでました。


NVIDIAATIでのGLSL対応具合の違いを以下に書いておきます。
NVIDIAはGeforce6600GT ドライバがNVPerfKit2.2のInstrumented Driver
ATIはX1650Pro ドライバがCatalyst Software Suite ver7.1
で確かめたので他のハード、ドライバだと下記と違うことがあるかもしれません。

  • ATIではconst変数を非const変数から初期化できない。
  • ATIでは配列を{}を使って初期化できない。

nvidiaでは配列を{}を使って、vec3 v[2] = {vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0)};と初期化できる。
ATIではArray constructorを使って、
vec3 v[2] = vec3[2](vec3(...), vec3(...));
と初期化できる。
nvidiaではArray constructorを使うとsyntax errorになる。
GLSLangSpecのver1.10では配列を初期化する構文が決まってないっぽい。
GLSLangSpecのver1.20ではArray constructorによって初期化できるとある。

  • ATIではGLSLでsamplerRECTが使えない。
  • ATIでは%を使えない。

%を使うと
'%' : supported in pack/unpack shaders only
とエラーがでる。


ATIのほうだとPixel Buffer Object(PBO)を使ったとき、glUnmapBufferARBを呼び出した後にglBindTexture(),glTexSubImage2D()を呼び出すとドライバ内でクラッシュします。
今使ってるテクスチャのフォーマットだとPBOを使わなくてもあんまり転送速度に差がでないのでしばらくは普通にglTexSubImage2Dでデータを転送することにしました。


そういえば、NVIDIAのグラボを使っているとき、GPUPPURasのDirect3D実装とOpenGL実装ではOpenGL実装のほうが速かったのですがATIのグラボではDirect3D実装のほうが速かった。