2013/05/14(火) [n年前の日記]
#3 [prog] pyglet + Radeon で描画できない件について
以下のページを眺めると、「Catalyst 12.4 (video driver 8.961.0.0)以降は直ってるはずだぜ。だからこの件は解決ってことで!」と書いてあるように見えるのだけど。
_linux - pyglet vertex list not rendered (AMD driver?) - Stack Overflow
_Issue 544 - pyglet - Batches are not being draw - Cross-platform windowing and multimedia library for Python. - Google Project Hosting
「それ、ホントかよ?」と思えてきたので、試しに自分の手元のPCでも実験。
結果だけど。
やっぱりダメだった。vertex_list.draw() や batch.draw() を使ったほうは描画されてない。…畜生! 直ってねえよ! 解決してねえよ! 今も Radeon はバグ持ちだよ!
そして、前述のページ内で言及されていた通り、「v2i」を「v2f」に修正してみたところ、正常に描画されてしまったわけで。うーん。
「"v2i"を"v2f"にするだけで描画されるなら、とりあえず全部、"v2f"にしとけばいいんじゃねえの?」と思ったりもしたけれど。本来の仕様や規格とは異なる呼び方、場当たり的な回避策で固定するなんて許されることなんだろうか、という気もするし。ATI/AMDがOpenGL絡みのバグを抱えたままだから、仕方なくそうせざるを得ないという話でしかないだろうし。
でも、こういうバグ持ちなバージョンのドライバを使い続けてる環境も多いだろうし。特定アプリのために、古いドライバに戻してくれなんて、フツーは言えないし。実際にどの環境でも動くようにと考えたら、場当たり的でもいいからとにかくソレをやるしかないのでは、という気も。
どういう選択が正解なのか、よくわかりませんな…。
_linux - pyglet vertex list not rendered (AMD driver?) - Stack Overflow
_Issue 544 - pyglet - Batches are not being draw - Cross-platform windowing and multimedia library for Python. - Google Project Hosting
「それ、ホントかよ?」と思えてきたので、試しに自分の手元のPCでも実験。
結果だけど。
やっぱりダメだった。vertex_list.draw() や batch.draw() を使ったほうは描画されてない。…畜生! 直ってねえよ! 解決してねえよ! 今も Radeon はバグ持ちだよ!
そして、前述のページ内で言及されていた通り、「v2i」を「v2f」に修正してみたところ、正常に描画されてしまったわけで。うーん。
「"v2i"を"v2f"にするだけで描画されるなら、とりあえず全部、"v2f"にしとけばいいんじゃねえの?」と思ったりもしたけれど。本来の仕様や規格とは異なる呼び方、場当たり的な回避策で固定するなんて許されることなんだろうか、という気もするし。ATI/AMDがOpenGL絡みのバグを抱えたままだから、仕方なくそうせざるを得ないという話でしかないだろうし。
でも、こういうバグ持ちなバージョンのドライバを使い続けてる環境も多いだろうし。特定アプリのために、古いドライバに戻してくれなんて、フツーは言えないし。実際にどの環境でも動くようにと考えたら、場当たり的でもいいからとにかくソレをやるしかないのでは、という気も。
どういう選択が正解なのか、よくわかりませんな…。
◎ 環境や動作確認サンプルをメモ。 :
Windows7 x64 + Python 2.6.6 + pyglet 1.2 alpha 1。
ビデオカード(ビデオチップ)周りの情報は以下の通り。 _HWiNFO32 で取得。
動作確認に使ったスクリプトは以下の通り。コピペしてきただけ…。
ビデオカード(ビデオチップ)周りの情報は以下の通り。 _HWiNFO32 で取得。
ATI/AMD Radeon HD 4200 (RS880) [General Information] Device Name: ATI/AMD Radeon HD 4200 (RS880) Original Device Name: ATI/AMD Radeon HD 4200 (RS880) Device Class: VGA Compatible Adapter Revision ID: 0 Bus Number: 1 Device Number: 5 Function Number: 0 PCI Latency Timer: 0 Hardware ID: PCI\VEN_1002&DEV_9710&SUBSYS_97101849&REV_00 [System Resources] Interrupt Line: N/A Interrupt Pin: INTA# Memory Base Address 0 D0000000 I/O Base Address 1 D000 Memory Base Address 2 FE9F0000 Memory Base Address 5 FE800000 [Features] Bus Mastering: Enabled Running At 66 MHz: Not Capable Fast Back-to-Back Transactions: Not Capable [Driver Information] Driver Manufacturer: Advanced Micro Devices, Inc. Driver Description: ATI Radeon HD 4200 Driver Provider: Advanced Micro Devices, Inc. Driver Version: 8.970.100.7000 Driver Date: 16-Nov-2012 DeviceInstanceId PCI\VEN_1002&DEV_9710&SUBSYS_97101849&REV_00\4&2417585A&0&2808Driver Version は、8.970.100.7000 なので、前述のページで書かれていた 8.961.0.0 より新しい…と思う。たぶん。
動作確認に使ったスクリプトは以下の通り。コピペしてきただけ…。
import pyglet window = pyglet.window.Window(640, 480) w, h = window.get_size() vl = pyglet.graphics.vertex_list(4, ('v2i', (100, 0, 100, h, 200, h, 200, 0)), ('c3B', (255, 255, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255))) batch = pyglet.graphics.Batch() x = 220 y = 10 width = 70 height = 200 color = 127, 127, 0, 127 color2 = 0, 127, 0, 127 batch.add_indexed(4, pyglet.gl.GL_TRIANGLES, None, [0, 1, 2, 1, 2, 3], ('v2i', (x, y, x + width, y, x, y + height, x + width, y + height)), ('c4B', tuple(color * 4))) x += w / 2 @window.event def on_draw(): window.clear() vl.draw(pyglet.gl.GL_QUADS) batch.draw() pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2i', (400, 0, 400, h, 500, h, 500, 0)), ('c3B', (255, 255, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255))) pyglet.graphics.draw_indexed(4, pyglet.gl.GL_TRIANGLES, [0, 1, 2, 1, 2, 3], ('v2i', (x, y, x + width, y, x , y + height, x + width, y + height)), ('c4B', tuple(color2 * 4))) pyglet.app.run()
◎ 2013/05/15追記。 :
一応実行ファイルとソース一式も置いとくです。
_test_pyglet_v2i_20130515.zip
_test_pyglet_v2i_20130515.zip
- pyglet_v2i.exe を実行すれば、"v2i"指定版が起動。
- pyglet_v2f.exe を実行すれば、"v2f"指定版が起動。
- src/以下にスクリプトソース入り。
◎ AMD Driverのバグについて :
_The AMD Driver Bug Thread - [H]ard|Forum
にまとまってた。結構あるんだなあ…。
「昔のOpenGL仕様を使ったアプリを動かすとマズイことになる」てな話が気になる。今回の不具合も、そのあたりが絡んでるのだろうか。わからんけど。
なんだか ATI/AMD だけdisってる感もあるけど、NVIDIAのドライバも結構バグがあるはずなので…。一時期は、 _ビデオカードを熱で故障させちゃうドライバ を出しちゃってたし。ハードウェアを壊しちゃうのは、さすがにクリティカル過ぎる…。
なので、ATI/AMDはとにかく糞と言いたいわけでもなく。どれを選んでも何かしら抱えてるはずだろうと。…まあ、OpenGL使いたいなら、ATI/AMD は今でも避けるのがどうやら無難っぽいですなあ、ぐらいの話で。
ビデオチップは複雑な処理をするハードウェアだし、次々に新チップも出さなきゃいかんし、基本的には DirectX重視の市場だろうから、仕方ないのかも、てな気もしています。
「昔のOpenGL仕様を使ったアプリを動かすとマズイことになる」てな話が気になる。今回の不具合も、そのあたりが絡んでるのだろうか。わからんけど。
なんだか ATI/AMD だけdisってる感もあるけど、NVIDIAのドライバも結構バグがあるはずなので…。一時期は、 _ビデオカードを熱で故障させちゃうドライバ を出しちゃってたし。ハードウェアを壊しちゃうのは、さすがにクリティカル過ぎる…。
なので、ATI/AMDはとにかく糞と言いたいわけでもなく。どれを選んでも何かしら抱えてるはずだろうと。…まあ、OpenGL使いたいなら、ATI/AMD は今でも避けるのがどうやら無難っぽいですなあ、ぐらいの話で。
ビデオチップは複雑な処理をするハードウェアだし、次々に新チップも出さなきゃいかんし、基本的には DirectX重視の市場だろうから、仕方ないのかも、てな気もしています。
◎ 2017/03/19追記。 :
Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。
[ ツッコむ ]
以上です。