1

ActionScript Stage3D チュートリアルの例は、「そこに」かなりあります。初心者に動作するコードを提供しようとするすべての人に感謝します。そうは言っても、ウィキペディアのエントリで概説されているように、ランバート反射率を正しく処理していると思う例をまだ見つけたとは思いませんが、初心者として、おそらく実装を理解できなかっただけだと追加するのをためらっています。

これが、実装の基本的な要件であると私が考えるものです-光源の向きを比較できることです[私は意図的に、この議論を、太陽を模倣する「指向性ライト」ではなく、「指向性ライト」のより単純なケースに限定しています。スポット ライト'.] を、照らされる面の法線の向きに合わせます。

そして、ここに私が目にしている問題の核心があると思います。ほとんどの場合、オブジェクトのジオメトリが作成されているときに、面の法線の計算が実行されているということです。そのため、シェーダに渡される法線の値は、ローカル オブジェクト空間で表現されます。

この素晴らしいフォーラムの仕組みについて、CPU で使用されているセットアップ コードまたは GPU で使用されているシェーダー コードの特定の間違いを特定できるように、サンプル コードを提供することをお勧めします。私は多くの異なるフレームワークを使用してこの問題の例を見つけることができるので、私が必要としているのは、特定のコード化された解決策ではなく、写真のようにリアルなレンダリングを得るために実際に何が必要かを明確にすることだと思います.固定されたカメラの視点、移動しない光源、および鏡面反射などの考慮事項を無視するという単純な基本ケースのオブジェクト。

したがって、2 つのベクトルのドット積を実行する場合:

A. 照らされる三角形の面の法線を表す Vector3D 値は、3 つの頂点のオブジェクト空間値または変換後のワールド空間値を使用して計算する必要がありますか?

B. ワ​​ールド空間の値が必要な場合、動的に計算された通常のワークロードは、CPU または GPU の各レンダリング サイクルで実行する必要がありますか?

ありがとうございました。

4

1 に答える 1

0

テリー 私は最近同じ問題に遭遇しました。あなたはそれを解決したか、先に進んだと思います。でも、とにかく質問に答えようと思いました。

頂点シェーダーで法線を変換することにしました。

var vertexShader:Array = [
"m44 vt0, va0, vc0", // transform vertex positions (va0) by the world camera data (vc0)
// this result has the camera angle as part of the matrix, which is not good when     calculating light
"mov op, vt0",       // move the transformed vertex data (vt0) in output position (op)
"add v0, va1, vc12.xy", // add in the UV offset (va1) and the animated offset   (vc12) (may be 0 for non animated), and put in v0 which holds the UV offset
"mov v1, va3",          // pass texture color and brightness (va3) to the fragment shader via v1
"m44 v2, va2, vc4",     // transform vertex normal, send to fragment shader

// the transformed vertices without the camera data
"m44 v3, va0, vc8",     // the transformed vertices with out the camera data, works great for default AND for translated cube, rotated cube broken still

フラグメントシェーダーで

// normalize the light position
"sub ft1, v3, fc0",  // subtract the light position from the transformed vertex postion

"nrm ft1.xyz, ft1",  // normalize the light position (ft1)

// non flat shading
"dp3 ft2, ft1, v2",  // dot the transformed normal with light direction
"sat ft2, ft2",      // Clamp dot between 1 and 0, put result in ft2.

最後になりましたが、渡すデータは何ですか! 魔法を見つけるのにかなりの実験が必要でした。

// mvp is the camera data mixed with each object world matrix
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, mvp, true); // aka vc0
// $model is the model to be drawn
var invmat:Matrix3D = $model.modelMatrix.clone();
invmat.transpose();
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 4, invmat, true); // aka vc4
var wsmat:Matrix3D = $model.worldSpaceMatrix.clone();
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 8, wsmat, true); // aka vc8

これが将来誰かに役立つことを願っています。

于 2013-12-13T16:35:01.183 に答える