頂点シェーダーを使用してモデルの法線を表示できますか?

StackOverflow https://stackoverflow.com/questions/1616264

  •  06-07-2019
  •  | 
  •  

質問

現在、「glDrawArrays(GL_TRIANGLES、...);」で描画している(3DS)モデルのテクスチャ座標、法線、および頂点にVBOを使用しています。デバッグのために、モデルを描画するときに法線を(一時的に)表示したい。イミディエイトモードを使用して、vertからvert + normalに各線を描画する必要がありますか、またはすべての法線を描画するためにvertとvert + normalで別のVBOを挿入しますか。 -OR-モデルを描画するときに既に渡された頂点と法線データを使用して、法線を描画するときに使用されるV + Nを計算する方法が頂点シェーダーにありますか?

役に立ちましたか?

解決

いいえ、頂点シェーダーから追加の線を描画することはできません。

頂点シェーダーは、ジオメトリを作成することではなく、頂点ごとの計算を行うことです。頂点シェーダーを使用して、 glDrawArrays(GL_TRIANGLES、0,3)と言うと、これが描画するもの、つまり1つの三角形を正確に指定します。処理が頂点シェーダーに到達すると、その三角形の頂点のプロパティのみを変更できます。その形状は変更できません。形状、形状、トポロジ、および/またはジオメトリの数は変更できません。

探しているのは、 OpenGL 3.2がジオメトリシェーダーとして定義するものです。これにより、シェーダーから任意のジオメトリカウント/トポロジーを出力できます。ただし、これはOpenGL 3.2でのみサポートされており、現在サポートしているカード/ドライバーの数は多くないことに注意してください(数か月前にリリースされました)。

ただし、通常の表示(何らかのデバッグをサポートするほとんどのエンジン)は通常、従来のラインレンダリングで行われ、適切な位置(P、P + C * N)各メッシュ位置に対して、Cは法線を表示するために使用する長さを表す定数です。書くのはそれほど複雑ではありません...

他のヒント

ジオメトリを2回描画することでこれを近似できます。通常どおりに描いてください。 2回目は、ジオメトリをGL_POINTSとして描画し、頂点の法線によって各頂点の位置をオフセットする頂点シェーダーをアタッチします。

これにより、モデルがサーフェス上に浮かぶ一連のポイントを持つことになります。各ポイントは、対応する頂点からの法線の方向を示します。

これは完全ではありませんが、使用したい内容によっては十分かもしれません。

更新: AHA!そして、一定のスケーリング係数を頂点シェーダーに渡し、時間が経つにつれてアプリケーションがその係数を0から1の間で補間するようにすると、頂点シェーダーによってレンダリングされたポイントは、適用される頂点から開始して、時間とともにアニメーション化します。そして、その法線の方向に浮かんでいます。

巧妙に記述された頂点シェーダーを使用すれば、多かれ少なかれ正しい効果を得ることができますが、多くの作業が必要になります。とにかくこれはデバッグ目的のためであるため、数行だけを描画する方が良いようです。パフォーマンスの低下は深刻ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top