顔の法線がプレーヤーの「カメラ」の方向に対して垂直である 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
しかし、これはすべて、惑星に対する位置に応じて、大気の半分が描かれたように見える奇妙なレンダリング動作を引き起こしています. 困惑。どんな助けでも大歓迎です。