2010年4月25日日曜日

GLSharp更新しました

GLSharpを更新しました。
→ ver. 5.4.2

最近、新しいノートPCを買ったのだが、
それでGLSharpのデモを実行したらエラーに。
で、原因を調べてみると、
OpenGLのバージョンを取得するところで、
あからさまに書きかけっぽいコードが・・・
ビデオドライバの挙動によってエラーになったりならなかったりする様子。
さっそく修正しました。

前のバージョンでデモが動かなかった方、
たぶんこの修正で動くようになると思います。
失礼しました。

13 件のコメント:

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

GLSharp使わせて頂いています。

GLSControlを2つ並べて使用して、2つに同じ内容を描画しているのですが、
2つ目のGLSControlでのポリゴン表示が化けてしまいます。

GLSharp_Demoで試しても再現しました。(再現手順)
1.GLSControl追加して、左右に同じものを表示
2.元のGLSControlでMQOviewerに切り替えてモデルを表示
3.モデル読込み
4.追加したGLSControlの表示が化けました

お手数ですが、調査をお願い出来ますでしょうか。

宜しくお願いします。

一歩二歩散歩 さんのコメント...

バグ報告ありがとうございます。
4.の「表示が化け」たというのは、具体的にどのようなことが起こるのですか?

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

「表示化け」とは、ポリゴンのテクスチャが貼られていない状態になります。

サンプルの以下の文字それぞれが、テクスチャが貼られていない矩形のポリゴンで表示されました。

テクスチャ テキスト
Texture Text
Frame count=95

立体になっている「あ」はそのままでした。
他は、消えました。

一歩二歩散歩 さんのコメント...

了解です。
私の方でも試したのですが、うまく再現できませんでした。
すいません、もう一つ確認ですが、
「GLSControl追加して、左右に同じものを表示」
というのは、

form1.cs
void OnLoad(EventArgs e)
{
// ...
//サンプルのコード

//デザイナで追加した2つめのGlsControlに
//描画するシーンを設定
this.glsControl2.RenderingScene
= new TextSample();
}

こんな感じですか?

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

その様に設定しました。

しかし、本日動作確認を行ったら、症状が再現しなくなりました。別の要因が絡んでいるみたいなので、もう少し調べてみます。

一歩二歩散歩 さんのコメント...

私の方で、何度かやってみたところ、
再現したりしなかったり、
別の化け方(ポリゴンの向きが裏返ったり、
ビットマップのほうのレイアウトが崩れたり)
になったりで、妙な挙動をするようです。
原因は、おそらくですが、
同じスレッド上に2つのレンダリングコンテキストがあるので
その切替がうまく行っていないのではないかと
いう気がしています。

>GLSControlを2つ並べて使用して、2つに同じ内容を...
そういうことであれば、GLSControlの幅を2倍にして
1. ビューポートを右半分に設定して描画、
2. 次にビューポートを左半分に設定して描画
とした方が良いかと思います。
http://sky.geocities.jp/freakish_osprey/opengl/opengl_viewport.htm

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

調査有難うございます。

その提案で対応しようと思います。

ま~ さんのコメント...

はじめまして。
便利なライブラリの公開をありがとうございます。


匿名の方と似たような現象が発生したので報告します。

自分は1つのフォームに対してGLSControlを4つ貼り、3Dグラフィックツールの三面図的な使用をしていました。
マウスドラッグ操作では問題は出ませんが、マウスホイールでズームを行うと対象コントロールの表示結果が他のコントロール上に反映されてしまいます。
反映するコントロールはほぼランダムで、フォームからコントロールに対して直接メソッドを呼び出してもダメでした。

ただしフォームをリサイズして再描画してやると意図した結果が表示されますので、コメントでの指摘にありましたレンダリングコンテキストの切り替えが問題なのかなと思っております。
とりあえずビューポート分割で対応してみます。

ま~ さんのコメント...

はじめまして
便利なライブラリをありがとうございます。
使用していて匿名の方と同様な現象が出たので報告しておきます。

フォーム上のスプレッドコンテナにGLSControlを4つ貼り、
3Dグラフィックツールのような3面図+パースを実装しようとしています。
マウスドラッグによる移動などでは現象はでませんが、マウスホイールで
ズームをしようとすると指定したコントロール以外の結果が反映されることがあります。

このとき結果が反映されるコントロールはランダムで決まり、
フォームでマウスホイールイベントを受けるようにし、直接該当コントロールを
指定してメソッドを呼び出しても他のコントロールの表示が更新されます。

ちなみに現象が発生したあとでフォームをリサイズすると想定した結果になります。


とりあえずビューポートを複数用意する方法に切り替えてみましたが、
境界線の処理(描画とリサイズ)が思いの外めんどうでどうしようか検討中です。。。

一歩二歩散歩 さんのコメント...

初めまして、一歩二歩散歩です。
すいません、どうも最近、
普通のコメントがなぜかスパムと誤判定されてしまい、
非表示になってしまうことがあるようでして。

> フォーム上のスプレッドコンテナにGLSControlを4つ貼り

この場合、同一スレッド上に
複数のレンダリングコンテキストがある状態になるので、
描画する際には、
カレントのレンダリングコンテキストを
適切なものに切り替えてから描画する必要があります。
ですので、RenderingContext.MakeCurrent()メソッドで、
そのGLSControlのレンダリングコンテキスト(GLSControl.Contextプロパティ)に
切り替えてから、
シーンの描画を行うようにしてください。

ま~ さんのコメント...

指摘いただいたMakeCurrent()メソッドについて調べてようやく理解できました。
おかげで想定した動作を得ることができました。
ありがとうございます。

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

質問させていただきます。GLSControlを2つ並べて同じようなポリゴンを表示し、片方の図形を回転させたときに、もう片方も同じように回転させるにはどうするのがよいでしょうか?

一歩二歩散歩 さんのコメント...

いや、そういうのはOpenGLがどうこうという話でも無いでしょうから、GLSharpが担当する機能の範囲外なので、ご自分でなんとかしてくださいとしかいえませんが・・・。