1

私は3D開発に比較的慣れておらず、現在Actionscript、Stage3D、AGALを使用して学習しています。フラットシェーディングの単純な手続き型メッシュでシーンを作成しようとしています。ただし、照明用のシェーダーにサーフェス法線を渡す方法に固執しています。三角形ごとに単一のサーフェス法線を使用し、それぞれにフラットで均一なシェーディングを実行したいと思います。各頂点の法線を使用して見栄えの良い照明を実現するのは簡単ですが、これが私が求めている外観です。

シェーダーは通常、すべての三角形ではなくすべての頂点を処理するので、頂点ごとに1つではなく、三角形ごとに1つの法線を渡すことは可能ですか?私の考えはここで完全にずれていますか?シンプルでフラットなシェーディングを行う実例があれば、ぜひ感謝します。

4

1 に答える 1

2

私はグーグルでそれを見つけたので、ここで古い質問を掘り下げています、そして受け入れられた答えがないのを見ることができます。

Stage3Dには、シェーダーエンジンに相当する「GL_FLAT」オプションがありません。これが意味するのは、フラグメントシェーダープログラムは、3つのそれぞれの頂点の出力から(頂点プログラムを介して)常に「変化する」または補間された値を受け取るということです。フラットシェーディングが必要な場合は、基本的に1つのオプションしかありません。

三角形ごとに3つの一意の頂点を作成し、各頂点の法線を三角形の面法線に設定します。このように、各頂点は同じ照明を計算し、同じ頂点の色になります。フラグメントシェーダーが補間するとき、3つの同一の値を補間するため、フラットなシェーディングになります。

これはかなりラメです。三角形ごとに一意の頂点が必要なため、三角形間で頂点を共有することはできません。これにより、頂点数が確実に増加し、VertexBuffer3Dのアップロード中の遅延が増加し、全体的なフレームレートが低下します。しかし、私はどこにも良い解決策を見たことがありません。

于 2013-01-19T09:23:55.293 に答える