1

頂点法線を、頂点から始まり、指定されたスケールに基づいた距離で法線と同じ方向に伸びる線として表示したいと考えています。

これを行う最も簡単な方法は、モデル ビュー マトリックスの逆転置を使用して各法線をビュー空間に変換し、CPU のモデル空間の各法線の開始点と終了点を計算し、それらを線として描画することです。 GPU。

これを行うより良い方法はありますか?頂点の位置と法線をシェーダーに渡して線の位置を計算できるようにすることを考えましたが、これはより複雑なようで、シェーダーでブランチが必要になると思います。

4

2 に答える 2

2

テスト目的で法線を視覚化する必要がある場合は、法線のxyz座標を に設定するとよいでしょうgl_FragColor。あまり視覚的ではありませんが、これらの色を見ると法線が正確であるという全体的な印象を与えます。

この手法を使用して、VBO への法線のロードの正確性を確認しました。

于 2012-10-25T11:47:50.723 に答える
1

OpenGL ES 2.0では、CPU内で少しでも追加の計算がなければ、これは絶対に不可能です。すべての頂点をレンダリングして、単一の頂点ごとに魔法のように線を作成することはできません。したがって、法線に基づいて頂点シェーダー内の頂点座標を計算する場合でも、メッシュの元の頂点ごとに1行(つまり2つの頂点)を配置する必要があります。したがって、これには少なくとも頂点データの再構築が必要になります。

また、これには、シェーダー内のラインの開始頂点と終了頂点の間で何らかの方法でアンブイを行う必要があることも正しいです。ただし、必ずしも分岐は必要ありません。開始頂点の法線をすべて0に設定するだけです(線をレンダリングするときに他の法線は必要ないと仮定しますが、線は通常は点灯しません)。

CPU:

for each original vertex:
    generate two line vertices with attributes of original vertex
    set normal attribute of first line vertex to 0-vector
...
render all lines using following shader

GPU:

attribute vec3 position;
attribute vec3 normal;
...
void main()
{
    ...
    vec3 modelPos = position + normal;
    gl_Position = projMat * modelviewMat * vec4(modelPos, 1.0);
}

ただし、これで実際に何かが購入されるとは思いません。シェーダーに両方のラインエンドポイントの違いを通知する必要があり、これを実行したら、CPUの各ラインに2つの異なる頂点を生成する必要があるためです。これを行うと、シェーダーで計算を行う代わりに、法線に基づいて2番目の線の頂点の座標を変更できます。その小さなvec3-saxpyは実際にはそれほど費用がかからないはずです。しかし、シェーダーアプローチの方が速いかもしれません。試してみてください。

ジオメトリシェーダーを使用できるデスクトップGL3+では状況が異なります。すべての元の頂点をポイントとしてレンダリングし、ジオメトリシェーダーで各ポイントのラインを生成して、ポイントの法線に基づいてその座標を計算します。そうすれば、実際にはいかなる種類のCPU計算も必要ありません。ただし、残念ながら、ES 2にはジオメトリシェーダーがありません(ただし、ES 3についてはわかりません)。

于 2012-10-25T09:55:10.677 に答える