2012-02-16 8 views
9

メッシュモデルを実際のメッシュをはっきりと表示するOpenGL ES 2.0で表示したいので、各プリミティブ/トライアングルにスムーズなシェーディングを必要としません。私が考えることができる唯一の2つのオプションが各三角形は三角形表面へのすべての垂直、法線の独自のセットを持っている(が、その後私は、このオプションを使用して、三角形の中で頂点を共有することはできません推測) OpenGL ESで面ごとの法線を指定し、非平滑/平滑シェーディングを実現できますか?

  1. です
  2. は黒線を用いて三角形/プリミティブのエッジを示し、共有頂点を持つ通常の方法に固執し、各頂点の正常な

それはこのようになる必要がありますか?単純にプリミティブを読み込み、法線を指定しないで、OpenGL ES 2.0で各面に平らな陰影を作るのはなぜですか?

同様の質問Similar Stackoverflow question, but no suggestion to solution

+0

これについての回答が見つかりましたか? –

答えて

7

ので(任意の、なめらかなまたは平ら)あなたのメッシュ上のシェーディングを持つために、あなたはライティングモデルを必要とする、およびOpenGL ESはそれを推測することはできません。 GL ES 2には固定パイプラインはありませんので、(組み込みの照明モデルを使用して)あなたのために仕事をする組み込み関数を使用することはできません。

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

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

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

+0

これはOpenGL(非ES)の場合にも当てはまりますか? – Rick

+0

OpenGLには従来の固定パイプラインがありますが、使用することはお勧めしません。詳細はこちらの記事を参照してください。https://www.opengl.org/wiki/Fixed_Function_Pipeline – Benlitz

+0

ありがとうございます。私が得ようとしているのは、OS X 10.10(または10.11)のSceneKitを使って共有頂点の配列、三角形のインデックスの配列を渡し、それを平らにすることです。その下にはOpenGLやMetalが使われていますが、どちらについても分かりません。この著者(http://ronnqvi.st/custom-scenekit-geometry/)は、OpenGLができることではないと思っていたので、できるかどうかを見てきました。 。 – Rick

関連する問題