10

glDrawElements を使用してオブジェクトを描画する場合、OpenGL でフラット シェーディングを実現することは可能ですか? 理想的な方法は、可能であれば、各三角形の法線を 1 回だけ計算することです。

ソリューションは、プログラマブル パイプライン (コア プロファイル) のみを使用する必要があります。

4

2 に答える 2

9

実際、頂点を複製せずにこれを回避する方法はありますが、それぞれにいくつかの制限があります (少なくとも、OpenGL の限られた経験で考えられるもの)。

各三角形の法線の定数値を与える 2 つの解決策を確認できます。

  • シェーダーのように入力を宣言し、glProvokingVertexflatを介して値を与える頂点を選択します。高速ですが、三角形全体の法線として 1 つの頂点の法線を取得します。これは正しく見えない場合があります。
  • 三角形を取得して三角形を出力するジオメトリ シェーダーを使用して、面ごとに 1 つの法線を計算します。これは最も柔軟な方法であり、結果の効果を制御できますが、遅くなる可能性があります (もちろん、ジオメトリ シェーダー対応のハードウェアが必要です)。
于 2011-05-19T12:12:42.513 に答える
0

残念ながら、これを行う唯一の方法は、すべての頂点を複製することです。これは、属性が頂点ごとであり、三角形ごとではないためです。

あなたがそれについて考えるとき、これは私たちが即時モードでしたことです...

于 2011-05-19T10:23:17.377 に答える