3

ヘア パーティクル システムを使用して Blender 2.66 でヘアスタイルを作成しました。これは次のようになります。

ここに画像の説明を入力

ご覧のとおり、明度は線の断片に適用されています。変換後、ヘアスタイル メッシュを OBJ ファイル形式にエクスポートしました。私は自分のプログラムでそれを解析し、レンダリングは次のようになります:

ここに画像の説明を入力

パーティクルは GL_LINES として描画されています (私の OBJ ファイルでは、面ごとに 2 つの頂点があります)。

別のテスト プログラムでは、単純な線の断片で光度をテストしたいと考えていました。ここに私の頂点バッファがあります:

static GLfloat vertices[6] =
{
    0.000000f, 0.000000f, -2.000000f,
    0.000000f, 0.000000f, 2.000000f
};

static GLfloat normals[6] =
{
    0.000000f, 1.000000f, 0.000000f,
    0.000000f, 1.000000f, 0.000000f
};

static GLfloat colors[6] =
{
    0.000000f, 0.000000f, 1.000000f,
    0.000000f, 0.000000f, 1.000000f
};

そして結果(線はX軸に直交する原点で回転しています->より良い結果を得るためにglLineWidth(5.0f)を呼び出しました):

ここに画像の説明を入力

リアルタイム アニメーションで、光度は正しいが、線の特定の「側」にあることがわかりました。線分には無限の法線があると想定されており、法線は 2 つ (頂点ごとに 1 つ) しかないため、これは正常です。これらの 2 つの法線が方程式 Y = 0 -> n(0.0, 1.0, 0.0) の平面の法線であることを正確に示したいと思います。では、頂点ごとに複数の法線を追加することは可能でしょうか? OpengL ではそれができないと思います。しかし、おそらく別の方法が可能です。これは、線分の各部分で正しい光度を計算するために何をしたいのかを説明する図です。

ここに画像の説明を入力

上記の最初の写真でわかるように、Blender は線分でリアルタイムに光度を計算できます。さらに、この画像にあるのは OpenGL レンダーです。だから、それができると確信しています。同じ線分の座標を 2 回繰り返してみましたが、2 行目では反対の法線 n2(0.0, -1.0, 0.0) を適用しましたが、うまくいきません。「向こう側」は「暗い」です。2 つのポリゴンの場合も同じです。現在、GLSL シェーダーを使用しています。ジオメトリ シェーダーやテッセレーション シェーダーなどの特殊なシェーダーを使用することで可能だと思います。たぶんCUDA言語が必要です。確信はないけど。

誰でも私を助けることができますか?

4

2 に答える 2

1

ananthonline はすでにいくつかの参考文献を提供していますが、それらは単純なライン ストランド イルミネーション モデルとしては完全にやり過ぎです。

要求がそれほど高度でない場合は、フォン イルミネーション モデルをストランドに適用できます。「待って、ストランドには法線がありませんが、Phong には法線が必要ですか?」と尋ねるかもしれません。はい、いいえ。線分には、平面とも呼ばれる無数の法線があります。言い換えれば、線のストランド自体は平面に対して法線です。

phong モデルは、Lambertian 散乱モデルの仮定から始まります。つまり、入射角が「より」垂直になればなるほど、明るくなります。これを説明する数学は

I(phi) = I_max * cos( phi )

または、phi をベクトルに置き換えてcos( angle(↑a,↑b) ) = ↑a · ↑b||↑a|| = ||↑b|| = 1

I(↑a, ↑b) = I_max * ↑a · ↑b

さて↑c · ↑b = 0、どこで||↑c|| = 1、そして↑a · ↑b = 1 - ↑a · ↑c。しかし↑c · ↑b = 0、正常の定義です。↑bつまり、方向と光源への方向の線分について↑c、強度を次のように書くことができます

I(↑b, ↑c) = I_max * (1 - ↑b · ↑c)

それがライン用のフォンイルミネーションモデルです。たまたま、それは Blender が行っていることでもあります。

更新: 鏡面反射

鏡面反射の計算にのみ目の位置が必要です。ライン ストランドの法線が、ライン ストランドに垂直な光の方向ベクトルであると仮定することで、これを行うこともできます。線分の方向と光に向かう方向を↑b↑cします。次に、Gram-Schmidt 直交正規化法を適用すると、その場で法線を導き出すことができます↑n

↑n = normalize(↑c - ↑b·↑c)

それを使用して、通常のセットを構築できます

- vertex position
- vertex "normal"
- light direction
- light half direction

ライン ストランド頂点シェーダーでそれを通常の Phong フラグメント シェーダーに渡し、通常どおり計算を行います。

于 2013-04-10T22:42:11.090 に答える