2009年1月27日火曜日

blender - GLSLMaterial表示のバグ改善+エッジ(2)

今度こそ!修正+高速化。

1月28日19:20更新
Blender2.48 swapfix + GLSLedge
http://vmdimporter.googlepages.com/blender248swapfixedge.zip


前回修正していた、myswapbuffers.cは、修正なしの状態に。
ghostwinlay.cのglFinishを、うちのだと無くても動くみたいなので、GLSL表示の時は外しておく。そのほうが早い。GLSL以外でも多分いらないから、コメントアウトしてもおk。


void window_swap_buffers(Window *win) {
#ifdef _WIN32
// adding a glFinish() here is to prevent Geforce in 'full scene antialias' mode
// from antialising the Blender window. Officially a swapbuffers does a glFinish
// itself, so this feels really like a hack... but it won't harm. (ton)
//
// moved it here from ghost because it is a performance killer for the game engine,
// glFinish forces synchronization with the graphics card and calling it is strongly
// discouraged for good performance. (brecht)
//
if(! (G.fileflags & G_FILE_GAME_MAT_GLSL)) {
glFinish();
}
#endif
GHOST_SwapWindowBuffers(win->ghostwin);
}




そして、こちらが今回の目玉。
DirectXでもFSAAだとバックバッファ使えないのを思い出したので、
GLSL表示の時にバックバッファを使わせないように修正。
//BL_src drawview.c
//backdrawview3d()

#ifdef GL_MULTISAMPLE_ARB
m = glIsEnabled(GL_MULTISAMPLE_ARB);
if (m) { glDisable(GL_MULTISAMPLE_ARB); }
#endif



#ifdef GL_MULTISAMPLE_ARB
m = glIsEnabled(GL_MULTISAMPLE_ARB);
if (m) {
if(G.fileflags & G_FILE_GAME_MAT_GLSL) {
G.vd->flag &= ~V3D_NEEDBACKBUFDRAW;
return;
}


glDisable(GL_MULTISAMPLE_ARB);
}
#endif


すみません、これだと選択が出来なくなるようなので、もう少し調べたところ・・・
なんかこれが原因っぽいのでコメントアウト。
// BL_src drawobject.c
// draw_object_backbufsel(Object *ob)の中
//else bbs_mesh_solid(ob);

で、上手く動いています。(9300GMS、ドライバ185.20)


おまけ。

GL_LINE_SMOOTH
GL_POLYGON_SMOOTH

は、FSAAだと要らないので、すべて参照で検索して、glEnable()されている直後に、以下を挿入してDisableしました。マクロで強制してもいいけど。


#ifdef GL_MULTISAMPLE_ARB
if(glIsEnabled(GL_MULTISAMPLE_ARB)) { glDisable(GL_LINE_SMOOTH); } //or GL_POLYGON_SMOOTH
#endif

13 件のコメント:

匿名 さんのコメント...

http://vmdimporter.googlepages.com/blender248swapfixedge.zipを試してみましたが、Edit modeで陰線処理を有効にしている状態で
・メニューをなぞると暗転する
・Select with:Left Mouseの場合は左クリック長押し、Right Mouseの場合は右クリック長押しで出るメニューの表示時に暗転する
・AAの有無関係無く、マウスでの点・線・面の選択が出来ない、選択出来ても全く別の部分が選択される(特に多ポリゴンオブジェクト?)
といった症状がファイルによってランダムに発生します。
選択不可の症状はほぼ起きるファイルが決まっているのですが、暗転の方は
同じファイルでも操作している内に発生が起きたり止まったりと法則性が掴めない状態です。
ソースにパッチを当ててのテストはこれから行う予定ですが、とりあえずご報告まで。

匿名 さんのコメント...

とりあえずdrawview.cのみパッチを当てて試してみましたところ、上記の症状が全て発生しました。
ですので、原因はglFinishやGL_LINE_SMOOTH、GL_POLYGON_SMOOTHの削除ではなく、
バッファ関連処理のスルーにあると思われます。
念の為先日のパッチでも試してみましたが、こちらは先日書きました程度の不具合に留まる様です。

uimac さんのコメント...

うーん、うちの8600GTでは、完璧かつ高速に動くんですが、ドライバが古いからでしょうか・・。
9300GSMで、最新185.20を入れて試したところ、暗転は全くありませんでしたが、右リックで選択できませんね・・・。

暗転のは、バックバッファのスワップ情報がファイルと一緒に保存されているので、一度Solid表示にしてTextured表示にすると直るかもしれません。

ひとまず9300GSMのほうに開発環境構築して、試行錯誤してみます。

匿名 さんのコメント...

不具合の発生条件が特定出来ました。
前回のコメントは、テクスチャ表示がGLSLかそうでないかに気付かない状態でのものでしたので撤回致します。
・今回のパッチに限り、(drawview.cのみのパッチでも)テクスチャ表示をGLSLにしていない場合暗転現象が発生する。GLSL表示の場合は一切発生しない。
・選択不可の現象に関しては、テクスチャ表示をGLSLにすると選択不可になり、GLSL以外にすると選択可になる。ポリゴン数は無関係。
ドライバ185.20はリーク版でしたので181.20WHQLに入れ替えて試してみましたが、症状は変わりませんでした。
GLSL専用の切り捨て仕様でしたら、表示のみに関してはこれでも特に問題は無いかもしれません。

匿名 さんのコメント...

181.20ではなく181.22でした。

uimac さんのコメント...

詳細にありがとうございます。
それから、さらに原因の箇所を特定出来たので、更新したバージョンをうpしました。
9300GMS、185.20で、問題なく動くことを確認しています。

今度こそ完全に直っていて欲しいところ・・・。

匿名 さんのコメント...

http://vmdimporter.googlepages.com/blender248swapfixedge.zipをダウンロードし直して試してみましたところ、
選択は可能になりましたが暗転するケースが増えました(ドライバ181.22WHQL)。
修正前の物はGLSL時は暗転しませんでしたが、今度の物は公式2.48aと同程度頻繁に暗転します。
drawobject.cのみパッチを当てて試してもみましたが、結果は同じでした。
9300GSでは暗転しないとの事ですので、9300GSと8800GTSの動作に違いがあるのかもしれません。

uimac さんのコメント...

駄目でしたか・・・。
正直これ以上は良く分からないです・・動かない環境が無いですし、関数ポインタの山で、ちょっとコード追うのがしんどいです。

http://vmdimporter.googlepages.com/blender248swapfixedge2.zip

すみませんが↑これで駄目だったら以前のGLSL専用の切り捨て仕様ので諦めてください・・。

uimac さんのコメント...

↑すみません、さらに訂正。
9300GSで暗転しました。もうちょっと追ってみます。

匿名 さんのコメント...

有難うございます。
とりあえずhttp://vmdimporter.googlepages.com/blender248swapfixedge2.zipですと、
AAの有無、テクスチャーの表示モードに関わらずオブジェクトだけが暗転し、
選択時は無関係の場所が選択されますね。

intelligence さんのコメント...

conch246
flee756
keeper489
fair026
dock471

匿名 さんのコメント...

2.5ブランチの最新ビルドを試してみましたところ、
デフォルトでトリプルバッファリングする仕様になったせいか
全く暗転しなくなっていますね。

uimac さんのコメント...

おぉぉ!そうなのですかー
2.5ますます期待してしまいます。

あとGLSLのパフォーマンスが少し気になるので、レンダリング時だけ、ディスプレイリスト(またはVBO)にしようかと思ったんですが、モデファイアとかの変更が適用しにくいので諦めました。
ボーンベースのIKとか以外を、全部切り捨てた、ゲーム製作用バージョンとか作るのは有りかもしれない・・