5

私は OpenGL ES 1.1 を使用しており、Blender からの OBJ エクスポートを頂点データを含むバイナリ ファイルに変換する作業を行っています。私は実際にはすでに機能するツールを持っていますが、いくつかの変更に取り組んでおり、質問に出くわしました。

スムーズ シェーディングを使用しても、正しい法線 (フェース プレーンに垂直) を使用すると、フェースのフラットな外観が得られるようです。スムーズ シェーディングを有効にして適切な法線を使用すると (単純に Blender でシャープとしてマークされたエッジとエッジ分割モディファイアを適用するだけで)、スムーズなパーツとシャープなエッジの効果を得ることができます。

これでどこに行くかというと、2 つの質問があります。

  1. OBJ ファイルでスムーズ シェーディングまたはフラット シェーディングが示されている「s 1」または「s off」行は、スムーズ シェーディングおよび法線の使用の観点から完全に不要ですか?

  2. 実際に OpenGL で Flat shading に設定すると、法線は完全に無視されますか (または、すべてが面に対して垂直であると見なされます)?

4

2 に答える 2

9

頂点が滑らかに見えるためには、その法線は隣接する面の法線 (または同様のもの) の平均である必要がありますが、面の平面に対して垂直ではありません (すべての隣接する面の平均平面を意味する場合を除く)。

GL_FLAT は、面の色が三角形に補間されるのではなく、三角形の 1 つの角から取得されることを意味します (最初か最後かはわかりません)。この色は頂点の色または頂点の照明のいずれかに由来するため、実際には面ごとの法線を取得しますが、これは必ずしも面の方向ではなく、角の頂点の法線です。

OBJ ファイルに頂点ごとの法線がある場合、s 部分は必要ありません。ただし、これらを使用して頂点法線を計算できます。s の部分はスムージング グループで、32 ビットのビットフィールドとして解釈されます。したがって、実際には 32 の異なるスムージング グループがあり、すべての面が複数のグループに属することができます。したがって、「s 5」行の後のすべての面は、スムージング グループ 1 と 3 (最初と 3 番目のビット セット) の一部です。隣接する 2 つの面が同じスムージング グループの一部である場合、それらの間のエッジは滑らかになります (頂点は法線を共有します)。このようにして、必要な頂点ごとの法線を再構築できます。

于 2011-05-09T19:48:14.130 に答える
1

gl_flat と gl_smooth の間でモードを変更しても、頂点ごとの法線を使用している場合、レンダリングに影響がないようです。私が言えることからあなたの問題は、各面には法線が1つしかないということです。スムーズ シェーディングを行うには、各面に 3 つの法線 (頂点ごとに 1 つ) が必要であり、それらはすべて異なる必要があります。たとえば、円柱の内側に投影された場合、円柱の法線はすべて円柱の軸で交差する必要があります。モデルに滑らかな法線がある場合、OBJ エクスポートは頂点法線ごとにエクスポートする必要があります。おそらく面ごとに法線を割り当てているようです。OpenGL-ES でのレンダリングに関しては、スムージング グループは使用されず、法線のみが使用されます。

于 2011-05-09T16:17:10.497 に答える