私はレイトレーサを実行しており、現在の光線方向を計算するために、x軸とy軸の現在のピクセル値を使用して、開始される光線の位置を計算する遠近法補正を実装しました。 ここでは、コード片:新しいコードがレイトレーストレーサを遅くする理由は何ですか?
float fov = 60;
float invWidth = 1/float(image.getWidth());
float invHeight = 1/float(image.getHeight());
float angle = (fov * M_PI * 0.5/180);
float aspectratio = image.getWidth()/float(image.getHeight());
point camera = scene.getCamera();
for (int y=0; y<image.getHeight(); y++) {
for (int x=0; x<image.getWidth(); x++) {
......
......
float xx = (((x*invWidth) *2)-1) * angle * aspectratio;
float yy = (((y*invHeight)*2)-1) * angle;
Ray viewRay = { {camera.x, camera.y, camera.z}, {xx, yy, 1.0f}};
これまでのところ、とても良いそれが完璧に動作します。しかし、xxとyy(ピクセルの方向)の値はすべてのピクセルで計算する必要はなく、イメージの幅と長さに等しい数の2倍に過ぎないことに気付きました。 だから、このようにこれらの部分を書き直し:
float fov = 60;
float invWidth = 1/float(image.getWidth());
float invHeight = 1/float(image.getHeight());
float angle = (fov * M_PI * 0.5/180);
float aspectratio = image.getWidth()/float(image.getHeight());
float rays_x [image.getWidth()], rays_y [image.getHeight()];
for (int y=0; y<image.getHeight(); y++)
rays_y [y] = (((y*invHeight)*2)-1) * angle;
for (int x=0; x<image.getWidth(); x++)
rays_x [x] = (((x*invWidth) *2)-1) * angle * aspectratio;
point camera = scene.getCamera();
for (int y=0; y<image.getHeight(); y++) {
float yy = rays_y[y];
for (int x=0; x<image.getWidth(); x++) {
......
......
Ray viewRay = { {camera.x, camera.y, camera.z}, {rays_x[x], yy, 1.0f}};
私は基本的に光線の方向を予め計算し、アレイにそれらを記憶します。私はパフォーマンスのわずかな改善を期待しました。悲観的なケースでは何もなかったかもしれませんが、WORSTになることは決して予想されませんでした。 シーンをレンダリングする前に私は1.67を撮っていましたが、今は1.74です!大規模な落下ではなく、私が今より多くの仕事を減らすことを期待しているのを見て驚くべきことです。私はコンパイラの最適化(-O3と-Fast-Math)を無効にし、2つのアプローチでテストしました。 9.03から9.05になる前に、今は9.06から9.15になります。
どうすれば問題を調査する必要がありますか?私は、1024×4 = 4096 +(768 * 1024)しかないので、私は決してそれを疑うことはできませんが、レイ・イテレーションとrays_y [y] 4)= 7168バイトとなる。任意のアイデアをいただければ幸いです。
float yy = (((y*invHeight)*2)-1) * angle;
定数データである、とだけループごとに一度に計算する必要があります
私の回答は役に立ちましたか?パフォーマンスはどのようになっていますか?それ以上の助けが必要ですか? –
正しい方法で実装しているかどうかは分かりませんが、ループ外の変数を初期化することもできます: 'float xx、xxstart = -angle * aspectratio、yy = -angle、xstep = angle * aspectratio * 2 * invwidth 、ystep = angle * 2 * invheight; 'そして、ループ内の値を更新する:' xx = xxstart; ... yy + = ystep; ... xx + = xstep; '。 –