現在、「glDrawArrays(GL_TRIANGLES, ...);」で描画している (3DS) モデルのテクスチャ座標、法線、および頂点に VBO を使用しています。デバッグのために、モデルを描画するときに法線を (一時的に) 表示したいと考えています。vert から vert+normal までの各線を描画するために即時モードを使用する必要がありますか? -または- 別の VBO に vert と vert+normal を詰めて、すべての法線を描画します... -または- 頂点シェーダーが頂点を使用する方法はありますか?法線を描画するときに使用される V+N を計算するためにモデルを描画するときに、法線データが既に渡されていますか?
3 に答える
いいえ、頂点シェーダーから追加の線を描画することはできません。
頂点シェーダーは、ジオメトリを作成することではなく、頂点ごとの計算を行うことです。頂点シェーダーを使用して、あなたが言うときglDrawArrays(GL_TRIANGLES,0,3)
、これはあなたが描くもの、すなわち1つの三角形を正確に指定するものです。処理が頂点シェーダーに到達すると、その三角形の頂点のプロパティのみを変更でき、ジオメトリのトポロジやカウントを変更することはできません。
探しているのは、OpenGL 3.2がジオメトリシェーダーとして定義しているものです。これにより、シェーダーから任意のジオメトリカウント/トポロジを出力できます。ただし、これはOpenGL 3.2でのみサポートされており、現在サポートされているカード/ドライバーは多くないことに注意してください(数か月間サポートされていません)。
ただし、法線の表示(ある種のデバッグをサポートするほとんどのエンジン)は通常、適切な位置(P、P + C * N)で埋められる追加の頂点バッファーを使用した従来のラインレンダリングで行われることを指摘する必要があります。 )メッシュ位置ごと。ここで、Cは、法線を表示するために使用する長さを表す定数です。書くのはそれほど複雑ではありません...
これは、ジオメトリを 2 回描画することで近似できます。通常どおりに描画します。2 回目は、ジオメトリを GL_POINTS として描画し、頂点法線によって各頂点位置をオフセットする頂点シェーダーをアタッチします。
これにより、モデルがサーフェス上に浮かぶ一連のポイントを持つことになります。各ポイントは、対応する頂点からの法線の方向を示します。
これは完璧ではありませんが、使用目的によっては十分かもしれません。
更新:ああ!また、一定の倍率を頂点シェーダーに渡し、アプリケーションでその倍率を時間の経過とともに 0 から 1 の間で補間する場合、頂点シェーダーによってレンダリングされたポイントは、適用される頂点から開始して、時間の経過とともにアニメーション化されます。そして、その法線の方向に浮いています。
巧妙に作成された頂点シェーダーを使用して、多かれ少なかれ適切な効果を得ることはおそらく可能ですが、それは大変な作業になります。とにかくこれはデバッグ目的のためなので、数行だけ描画する方が良いようです。パフォーマンスへの影響は深刻ではありません。