9

OpenGL ES 2.0 でメッシュ モデルを表示したいのですが、実際のメッシュが明確に表示されるので、各プリミティブ/三角形をスムーズにシェーディングしたくありません。私が考えることができる唯一の2つのオプションは

  1. 各三角形には独自の法線のセットがあり、すべて三角形の表面に垂直です (ただし、このオプションでは三角形間で頂点を共有できないと思います)。
  2. 黒い線を使用して三角形/プリミティブ エッジを示し、頂点を共有し、頂点ごとに 1 つの法線を使用する通常の方法に固執します。

このようにする必要がありますか?単純にプリミティブを読み込んで法線を指定せず、どうにかして OpenGL ES 2.0 に各面にフラット シェーディングを作成させることができないのはなぜですか?

同様の質問同様の Stackoverflow の質問ですが、解決策の提案はありません

4

1 に答える 1

7

メッシュ (スムーズまたはフラット) にシェーディングを適用するには、照明モデルが必要ですが、OpenGL ES はそれを推測できません。GL ES 2 には固定パイプラインがないため、(組み込み照明モデルを使用して) ジョブを実行する組み込み関数を使用することはできません。

フラット シェーディングでは、三角形全体が同じ色で描画され、その法線と光源の間の角度から計算されます (はい、光源も必要です。これは単に透視図の原点になる可能性があります)。これが、三角形ごとに少なくとも 1 つの法線が必要な理由です。

次に、GPU は非常に並列化された方法で動作し、複数の頂点 (およびフラグメント) を同時に処理します。効率的にするために、頂点間でデータを共有することはできません。これが、各頂点の法線を複製する必要がある理由です。

また、あなたが言ったように、メッシュは頂点法線ではなく頂点位置のみを共有するため、三角形間で頂点を共有できなくなりました。したがって、バッファに頂点を配置する必要があり3 * NbTriangles、それぞれに 1 つの位置と 1 つの法線があります。三角形のストリップ/ファンを使用する利点も得られません。これは、どの面も別の面と共通の頂点を持たないためです (これも法線が異なるためです)。

于 2012-06-04T02:58:45.660 に答える