ATIでのOpenGLの罠

NVIDIAカード(Geforce)ではうまく動いていたのに、
ATIカード(RADEON)でうまく動かなくなったというネタです。今回の使用APIはOpenGLです。

症状

ミップマップありのテクスチャで、ミップマップが使用されない。
ベースレベルの画像しか使われない(ことがある)、という現象が発生

原因および対処法

glTexImage2DとglTexParameteriの呼び出し順序が関係する模様です。

glTexParameteriでミップマップを使わない設定(GL_NEAREST)とかに設定して、
ミップマップありのテクスチャを作成&転送した場合、
それはミップマップなしのテクスチャとして作成されてしまう。
ミップマップありのテクスチャを作成したい場合にはミップマップを使用する設定のパラメータを設定しておき、
glTexImage2Dでテクスチャデータを転送する必要がある。

GL_NEAREST設定後、glTexImage2Dでのミップマップ設定は無視されるのか、
その後 GL_NEAREST_MIPMAP_NEAREST に設定を変更しても
テクスチャ自身がミップなし状態でリソース生成されてしまっているため、有効にならない。

まとめ

まさかそんな罠が潜んでいるとは…という感じでした。
確かに設定から考えてみると、ミップマップなしの設定された後テクスチャ転送なので、
最適化の観点から「使わないから余分なものを生成しない」というのは
合っているような気はします。
ちょっと強引な最適化ではありますが。

先日のDirectXの挙動といい、ATIはドライバ内で強引な最適化を施す傾向にあるのかもしれません。

シェアする

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

フォローする