0

顔の法線がプレーヤーの「カメラ」の方向に対して垂直である 0 にフェードするフラグメント シェーダーを開発しようとしています。(これは球形の惑星の大気のためのものです。私はそれらを外側の範囲でフェードさせたいと思っています)。

プレーヤーが常に「ユニバース位置」0、0、0 にあり、すべてのオブジェクトの transform.matrix3D がプレーヤーの移動に合わせて変換されるように、ゲームをセットアップしました。

複数のシェーダーが正常に動作していることを指摘しておく必要があります。一部のシェーダーには、テクスチャの混合、2 つのモデル間の補間、スペキュラー シェーディングが含まれます。しかし、この問題は私を打ち負かしました。

私は、フラグメントシェーダーがプレイヤーへの方向を知る必要があると考えていました (現在の面の法線とプレイヤーの方向との間の積をドット化できるようにするため)。ただし、モデルの「現在の」頂点位置 (つまり、シェーダーが現在描画している頂点出力位置) を逆プレイヤー カメラ方向に追加する必要もあります。そうすれば、そのモデル サーフェスの位置からカメラへの方向が正しくなります。

まあ、どうやらそうではありません。(私が何をしてきたかを説明することはできますが、人々がこの質問をすでに無視しているのを感じることができます...). モデルの頂点位置がモデルの中心位置から「オフセット」されているという事実も含める必要がある(と思う)ことを考えると、プレーヤーへの方向を正しく計算する方法を誰か教えてもらえますか?これは私の頭をやっています!

ありがとう。

編集

関連する AS3 コードとそれに続く AGAL は次のとおりです。

// invMatrix is a cloned and inverted copy of the Planet object's transform.matrix3D...
// .deltaTransformVector ONLY uses the matrix3D's rotation to rotate a vector3D...
var tempVector:Vector3D = invMatrix.deltaTransformVector(transform.matrix3D.position);
tempVector.normalize();
context3D.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 5, Vector.<Number>([-tempVector.x, -tempVector.y, -tempVector.z, 0]));
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 7, rotMatrix, true);
... other constants set here ...
context3D.setVertexBufferAt(3, mesh.normalsBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);

頂点シェーダーで:

"m44 v3, va3, vc7 \n" + // passed rotMatrix is used to rotate the face normals
"dp3 v4, vc5, va3 \n" + // put the dot product of the normalised, rotated camera position and the rotated normal in v4

次に、フラグメント シェーダーで次のようにします。

"mul ft0, ft0, v4 \n" + // multiply the sampled texture in ft0 by the passed dot product in v4

しかし、これはすべて、惑星に対する位置に応じて、大気の半分が描かれたように見える奇妙なレンダリング動作を引き起こしています. 困惑。どんな助けでも大歓迎です。

4

2 に答える 2

1

頂点から空間のある点までのベクトルを見つける必要がありますか? その場合は、1 つのフレーム、たとえばワールド フレームで作業するだけで済みます。そのためには、ワールド空間での目的の位置を知る必要があり、頂点をワールド空間に変換する必要があります (モデル行列を掛けるだけです)。

于 2013-11-27T07:51:07.063 に答える
0

OK - Volgogradetzzz さん、返信ありがとうございます。あなたは私が正しい「方向」で考えていたことを確実に安心させてくれました. 結局、多くのことを同時に正しくすることが問題になりました。私は最終的に:
1)相対的なUN回転カメラ位置をシェーダーに渡します。
2) オブジェクトの回転行列 (スケールは含まれますが、位置の変換は含まれません) によって、頂点シェーダーで頂点と法線バッファーを回転させます
。シェーダー
ということで、やっと動きました!(まあ、それは私の人生の1週間でした。二度と戻ることはありません)。

于 2013-12-03T12:47:53.270 に答える