質問

bitbltと標準のVB6描画関数を介して多くの描画を行うVB6アプリケーション(笑わないでください)があります。私はパフォーマンスの問題に反対しています(はい、メモリに描くなどの定期的なトリックをします)。それで、私は他の描画方法を調査することにし、OpenGLに出会うことにしました。

私はいくつかの実験をしてきましたが、私が望むことのほとんどをするのは簡単なようです。このアプリケーションは、主に非常にシンプルな描画のみを使用しています - それなど、比較的大きな2D長方形など - しかし、私はHatchbrushやPatternBrushのようなものと同等のものを見つけることができませんでした。

より具体的には、小さなモノクロピクセルパターンを指定し、色を選択し、ポリゴン(または何でも)を描くときはいつでも、それがしっかりしているのではなく、翻訳または回転ではなく、そのパターンで自動的にタイル張りになっているか、パターンの「オン」ビットが指定された色で表示され、パターンの「オフ」ビットが、私が現在描いている領域の下に描かれたものを表示して、パターンの「オン」ビットが表示されます。

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

「テクスチャ」は私が望むものを達成できるかもしれないと推測していますが、それは私には明らかではありません(私はこれにまったく新しいものであり、私が見つけたドキュメントは完全に明白ではありません)。ポリゴンの頂点に基づいて、テクスチャはパターンを歪めたり、翻訳したり、伸ばしたりするかもしれませんか?一方、パターンをタイル張りにしたいのです。

ピクセル/線/描画する必要があるものを正確に計算する以外に、これを行う方法、またはそのようなことをする方法はありますか?

どんな助けにもよろしくお願いします。

役に立ちましたか?

解決

私が正しく理解していれば、あなたは探しています glpolygonstipple() また gllinestipple().

Polygonstippleは32x32パターンのみを許可するため、非常に限られていますが、PatternBrushのように機能するはずです。しかし、VBでどのように実装するかはわかりません。

他のヒント

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

OpenGLには、点名線とポリゴンを描くことができる機能が含まれていますが、使用しないでください。それらは長い間非難されており、仕様のバージョン3.1のOpenGLから削除されました。そしてそれは理由のためです - これらの機能は最新のレンダリングパラダイムにうまくマッピングされず、最新のグラフィックスハードウェアによってサポートされていません - つまり、おそらくあなたが取得する可能性が高いことを意味します スロー それらを使用する場合、ソフトウェアフォールバック。

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

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

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

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

テクスチャを使用するだけです。画像のようにパターンを入れて、テクスチャを繰り返します。

これを理解しました 1〜2年前.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top