2009年1月25日日曜日

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

前回のコメ欄で頂いた、メニューバーなどに移動するとき暗転する問題ですが、
今朝早速調べてみたところ、多分改善しました。

2.48無印で悪いんですが、とりあえず修正版+GLSLMaterialエッジ付きをうpしておきます。

エッジはGLSLMaterial表示後、Blenderの標準EdgeをOnにすると付きます。太さも一応変えられます。ノードで色付けしてるとエッジの色に影響でるかも・・・。改善検討中だけど良く分からん。

追記:1月25日16:40さらに改善(下記参照)

Blender2.48 swapfix + GLSLedge
http://vmdimporter.googlepages.com/blender248swapfixedge.zip



どうもコード見ると、下のほうに目が行ってしまいがちで、最初自分もnVidia云々で調べていたんですが・・・


太字部分をみてください。・・・すごく・・・怪しいです・・・・



// BL_src - mywindow.c

void myswapbuffers(void)
{
ScrArea *sa;

sa= G.curscreen->areabase.first;
while(sa) {
if(sa->win_swap==WIN_BACK_OK) sa->win_swap= WIN_FRONT_OK;
if(sa->head_swap==WIN_BACK_OK) sa->head_swap= WIN_FRONT_OK;

sa= sa->next;
}


/* HACK, some windows drivers feel they should honor the scissor
* test when swapping buffers, disable the test while swapping
* on WIN32. (namely Matrox and NVidia's new drivers around Oct 1 2001)
* - zr
*/

#ifdef WIN32
/* HACK, in some NVidia driver release some kind of
* fancy optimiziation (I presume) was put in which for
* some reason causes parts of the buffer not to be
* swapped. One way to defeat it is the following wierd
* code (which we only do for nvidia cards). This should
* be removed if NVidia fixes their drivers. - zr
*/
if (is_a_really_crappy_nvidia_card()) {
glDrawBuffer(GL_FRONT);

glBegin(GL_LINES);
glEnd();

glDrawBuffer(GL_BACK);
}

glDisable(GL_SCISSOR_TEST);
window_swap_buffers(winlay_mainwindow);
glEnable(GL_SCISSOR_TEST);
#else
window_swap_buffers(winlay_mainwindow);
#endif
}


↓で、書き変えました。


while(sa) {
if(sa->win_swap == WIN_BACK_OK) {
sa->win_swap = WIN_FRONT_OK;
} else {
sa->win_swap = 0;
}
if(sa->head_swap == WIN_BACK_OK) {
sa->head_swap = WIN_FRONT_OK;
} else {
sa->head_swap = 0;
}

sa= sa->next;
}

多分改善したはず・・・!


追記:
→さらに改善。たぶん完全に直ったかも。(ただし非常に重くなるようです。対応は出来たらそのうち・・。次はバグ改善努力なしのエッジ付きバージョンもうpするか・・。)

endifの後に、これ追加で。

sa= G.curscreen->areabase.first;
while(sa) {
sa->win_swap = 0;
sa->head_swap = 0;
sa= sa->next;
}



Edgeサンプル(Blender起動時のCube)




4 件のコメント:

ids さんのコメント...

こんにちはー。
早速試してみました。
私の環境では、xerces-c_2_8.dll、がありません見たいなエラーが出たので、
http://code.google.com/p/uncwddas/downloads/detail?name=xerces-c_2_8.dll&can=2&q=
とりあえずここからDLして.exeのフォルダにコピーしたら動きました。

ウホッ!これはすごい。

uimac さんのコメント...

おぉっと!すみません、入れ忘れていました・・・。
入れなおして再うpします。→しました。

エッジは、やっつけ気味なので、また今度修正しまっす。次回は最新版でビルドしなおしてうpしたいところ。。

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

マニュアル通りに動作しないNVIDIAのカードを専用コードで動かしていたものの、
カードの世代交代によって動作が変わり齟齬が生じた、といったところなのでしょうか。
試してみましたところ、Edit Modeでは点や線、面の選択時の一瞬や
Select with:Left Mouseの場合は左クリック長押し、Right Mouseの場合は右クリック長押しで出るメニューの表示時に暗転する程度で、
メニューバーと3DView画面との行ったり来たりやナイフでは暗転しなくなりました。
ただ、パッチ適用後は強制AAの有無に関わらず3Dviewのパフォーマンスがかなり下がる様です。
International Fontsを有効にして、UIのフォントにAAが掛かる状況になると更に下がります。
メニューやボタン類も反応がワンテンポ遅れる印象で、特にFile Browserはかなり遅延します。
以下のデータは、Level2のSubsurfをかけた約115000ポリゴンのオブジェクトを
Rotation Angle:1の設定でNum4で一回転させるのに要した時間です。
ForcewareでAA8xQ,AFx16を強制しています。
パッチ無し
Default:19sec
International Fonts:19sec
Use textured Fonts:19sec

旧パッチコード
Default Font:55sec
International Fonts:86sec
Use textured Fonts:76sec

新パッチコード 
Default:64sec
International Fonts:94sec
Use textured Fonts:77sec

環境:Vista x64 SP2 Beta,Core2Quad 3GHz,Geforce 8800GTS(G92),Forceware 185.20

uimac さんのコメント...

詳細にテスト頂いてありがとうございます。
うーん、確かに遅くなってますね:(
EdgeをONにすると2回描画するので、多分更に遅くなります。

暗転の原因は、おそらく一部だけ再描画したいのにNVIDIAのカードが全画面更新していて、バックバッファの一部が間違って描画されているような気がします。

修正コードが遅いのは、まだ良く分かってないので、明後日くらいに調べてみようと思います。

それにしても環境が良くて羨ましい・・。うちはAAx4でいっぱいいっぱいです。