1

BitBltと標準のVB6描画機能を介して多くの描画を行うVB6アプリケーション(笑わないでください)があります。私はパフォーマンスの問題に直面しています(はい、メモリに描画するなどの通常のトリックを実行します)。そこで、他の描画方法を検討することにし、OpenGLに出くわしました。

私はいくつかの実験を行ってきましたが、私がやりたいことのほとんどを行うのは簡単なようです。このアプリケーションは、ほとんどの場合、非常に単純な描画(単色の比較的大きな2D長方形など)のみを使用しますが、HatchBrushやPatternBrushのようなものに相当するものを見つけることができませんでした。

具体的には、小さなモノクロのピクセルパターンを指定し、色を選択し、ポリゴン(またはその他)を描画するたびに、ソリッドではなく、そのパターンで自動的にタイル化され、変換または回転されないようにします。パターンの「オン」ビットが指定された色で表示され、パターンの「オフ」ビットが残って、現在描画している領域の下に描画されたものがすべて表示された状態で、歪んだり引き伸ばされたりします。

明らかに、私はすべての計算を自分で行うことができました。つまり、何らかの形で自動的に並べて表示されるポリゴンとして描画する代わりに、すべての線やピクセルなど、実際に描画する必要のあるものを計算してから、線やピクセルなどとして描画することができます。しかし、もっと簡単な方法はありますか?GDIのように、「このブラシを使用してこのポリゴンを描画する」と言うだけですか?

「テクスチャ」は私が望むことを達成できるかもしれないと私は推測していますが、それは私には明らかではありません(私はこれにまったく慣れておらず、私が見つけたドキュメントは完全に明白ではありません)。ポリゴンの頂点に基づいて、テクスチャがパターンを歪めたり、平行移動したり、伸ばしたりする可能性があるようです。パターンを並べて表示したいのに対して。

正確にピクセル/ライン/描画する必要があるものをブルートフォースで計算する以外に、これを行う方法、またはそのような方法はありますか?

助けてくれてありがとう。

4

5 に答える 5

2

私が正しく理解していれば、 glPolygonStipple()またはglLineStipple( )を探しています。

PolygonStippleは、32x32パターンしか許可しないため、非常に制限されていますが、PatternBrushのように機能するはずです。しかし、VBでそれを実装する方法がわかりません。

于 2010-06-06T16:13:23.320 に答える
1

まず、ここでボトルネックになっているのは描画操作そのものでよろしいですか?Visual Basic は非常に遅いことで知られています (特に、プログラムが中間 VM コードにコンパイルされている場合 - これはデフォルトの AFAIRC です。ネイティブ コードにコンパイルするオプションを必ず確認してください!)、それがボトルネックであるコードである場合の場合、OpenGL はあまり役に立ちません。コードを他の言語 (おそらく C または C++) で書き直す必要がありますが、.NET 言語でも同様です。

OpenGL には、点線や多角形を描画できる関数が含まれていますが、使用しないでください。それらは長い間非推奨であり、仕様のバージョン 3.1 で OpenGL から削除されました。これには理由があります。これらの関数は最新のレンダリング パラダイムにうまく対応しておらず、最新のグラフィックス ハードウェアではサポートされていません。つまり、これらの関数を使用すると、ソフトウェア フォールバックが遅くなる可能性が高くなります。

その方法は、小さなテクスチャをマスクとして使用し、描画されたポリゴンの上に並べることです。テクスチャは、頂点で指定したテクスチャ座標に一致するように引き伸ばされたり圧縮されたりします。両方のテクスチャ座標に対してラッピング モードを に設定しGL_REPEAT、テクスチャが元のサイズで表示され、適切な回数繰り返されるように、各頂点の適切な座標を計算する必要があります。

説明したようにステンシル バッファーを使用することもできますが、そのバッファーにパターンを入力し、高速に実行するにはどうすればよいでしょうか。とにかくテクスチャが必要です。描画を開始する前に、フレームごとにステンシル バッファーをクリアする必要があることに注意してください。そうしないと、パフォーマンスが大幅に低下する可能性があります(グラフィックス ハードウェアとドライバーのバージョンに応じて、「大規模」の正確な値が変わります)。

フラグメント シェーダーを使用して目的の効果を達成することも可能ですが、そのためのシェーダーを学習することは、あなたのような OpenGL 初心者にとってやり過ぎになるでしょう :-)。

于 2010-06-06T17:11:43.523 に答える
0

ああ、私はそれを見つけたと思います!ビューポート全体に希望するパターン (またはそのマスク) の形でステンシルを作成し、そのパターンで描画したいときにそのステンシルを有効にすることができます。

于 2010-06-06T15:16:21.423 に答える
0

テクスチャを使用することもできます。画像のようにパターンを配置し、テクスチャの繰り返しをオンにすると、準備完了です。

于 2010-06-06T15:16:38.177 に答える
0

1年か2年前にこれを考え出しました。

于 2010-06-06T22:39:17.380 に答える