0

最適化しようとしている問題があります。私はOpenGL関数を再現していますが、現在の問題は、nポイントの形状をラスター化し、ポイントに基づいて色をブレンドすることです。

ラスターは、長さScreen.Width * Screen.Height*3のバイトの1dim配列に格納されます。

私の実装は非常に遅いので、少し(まあ、たくさん)最適化したいと思います。シェイプ内の各ピクセルにアクセスし、各ポイントからの距離を取得し(Sqrt(x ^ 2 + y ^ 2)を使用します。これは、物事が遅いように見えます)、距離と頂点の色を使用して、その色を決定します。特定のピクセル。

私はこれを行うためのより速い方法があることを知っています。どんな助けでも素晴らしいでしょう!ああ、私はC#で働いています。

4

1 に答える 1

3

OpenGLやDirectx、さらにはGDI +を使用しない(正当な)理由があるとしましょう。

ラスタライズしようとしているグラフィカルプリミティブを本当に理解しているかどうかはわかりません。n点の多角形だと思います。このような形状の内部の色を補間することは、これを行うためのさまざまなアプローチがあるため、完全に簡単ではありません。だから問題は、あなたは何が欲しいのかということです。

凸面と凹面(または自己交差)ポリゴンの違いを考えてみてください。結果がどのように「あるべきか」は明確ではありません。そのため、グラフィックハードウェアは三角形以外のことを心配する必要がありません。(ほぼ)同じことをすることをお勧めします。

三角形の内側の色の補間は非常に簡単で明確です。グーグルの流行語はbaryzentric座標です。

したがって、残りの問題は、ポリゴンをどのように三角測量するかです。

  • 凸多角形の場合、現在すべての点に使用していると想定しているものと同様の補間を使用して、中点の色を簡単に補間できます。次に、その中点から形状の点まで三角形をスパンし、これらの内部を補間します。適切な色を取得するには、中間点が必要です。クワッドを考えてみてください。右上と左下の角が赤で、他の2つの角が青で色付けされています。これで、クワッドを2つの三角形に分割する可能性があり、どちらを使用するかに応じて、一定の色(赤または青)の対角線が表示されます。ただし、補間された色(暗いマゼンタのようなもの)で中点を挿入すると、すべてが正常に見えます(双一次補間を使用していたように)。

  • 自己交差するポリゴンの場合、状況は誰もが望むよりも悪いです。最初に手動で交差を決定し、ポリゴンを非自己交差ポリゴンに分割してから、各ポリゴンをそれ自体で処理します(現在のように、自己交差によって導入された新しいポイントの混合色を計算します)。

  • 凹多角形の場合は、多角形を凸面に分割してから、上記のように処理する必要があります。しかし、これは色補間の結果を変更します!したがって、ポリゴンの内側(カットされたピースのエッジ)の色が正しいことを確認する必要があります。したがって、凸多角形の中点の考え方と同様に、補間された色を保持する多角形の内側に新しい点を導入する必要があります。これを行う最良の方法は、ポリゴンを形成する点のボロノイセルを計算することです。これらのセルのコーナーポイントは、適切な補間ポイントである必要があります。

私があなたの問題をどのように処理するかについて、私がいくらか明確にできたことを願っています。これらすべてのことを行うことは可能ですが、それは本当に努力する価値がありますか?「コーディグレイ」が言ったように:なぜ複雑なものを再発明するのですか?

于 2011-02-05T17:07:20.300 に答える