3

C#(Pythonから移植)で、単純なレイトレーシング割り当てを実行しようとしています。サンプル コードが正しい図を表示するように管理できましたが、それを自分の割り当てに適応させようとすると、何かがうまくいかなくなります。

何が問題なのか分かっていれば、役立つと思われるコードをいくつか投稿しますが、どこから始めればよいかわかりません。

基本的に、私の割り当ては次のようなものを出力します:

http://i56.tinypic.com/2vcdobq.png

スペキュラ ハイライトをオンにして、

http://i53.tinypic.com/2e1r38o.png

それをオフにして。次のようになります。

http://i56.tinypic.com/2m7sxlh.png

My Phong 照明の式は次のようになります。

Colour I = diffuse_colour;
Vector L = light.vector;
Vector N = normal; //FIXME!
Colour Is = diffuse_colour * light.intensity;
Colour Ia = new Colour(1,1,1) * light.ambient;
Colour Kd = specular_colour;
Colour Ka = Kd;
double Ks = sharpness ?? 0.4;
Vector H = Vector.unit(view + L);

//Phong Illumination
//I = KaIa + KdIs max(0,L.N) + KsIs (H.N)^n

I = Ka * Ia
+ Kd * Is * Math.Max(0, L.dot(N))
+ Ks * Is * Math.Pow(H.dot(N),200); //FIXME?

そして、動作するサンプル コードからコピーしたので、動作することがわかりました。

私は困惑しているので、どんな考えでも素晴らしいでしょう。

4

3 に答える 3

4

同じアルゴリズムの 2 つの実装があります。あなたは、それらが異なる結果を生み出すと主張します。間違いを見つけるのは簡単に思えます: 両方のアルゴリズムをそれぞれのデバッガーで同時に段階的に実行します。両方のプログラムの状態を注意深く監視してください。それらが異なるプログラム状態を生成した瞬間、あなたのバグがあります.

于 2011-10-01T14:38:03.380 に答える
0

1つの実装はPythonで、もう1つはC#で行われたため、それほど単純ではありませんでした。2つの問題があったことが判明しました。

まず、私のポイントクラスでは、オーバーロード演算子の1つが間違っていました。(演算子-2点で、Vector(p1.x --p2.x、p1.y --p2.y、p1.x --p2.x)を返すようにしました...最後のペアは代わりにpzである必要があります。

私が犯したもう1つの間違いは、ビットマップイメージを保存しているときに、xとyに関して列と行が混同されてしまったことです。(列= x、行= y)

これが私のようなランダムな問題に遭遇した他の人に役立つことを願っています:P

于 2011-10-06T02:37:36.247 に答える
0

レイ トレーサーを書いている間、フォン イルミネーションについてよく理解するためにこの記事を調べました。だからここを見てください、私はあなたがアイデアを得ると確信しています:

www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/phong-illumination-explained-r667

于 2012-04-28T20:08:57.823 に答える