このアルゴリズムは、サンプラークラスから継承された均一なサンプリングアルゴリズム、です。
クラスの宣言:
一度の#pragma #ifndefの__REGULAR_HEADER__ の#define __REGULAR_HEADER__ の#include "sampler.h" クラスレギュラー:公共サンプラー{ パブリック: レギュラー(); 〜レギュラー(); レギュラー(CONST整数SAMPS)。 レギュラー(CONST整数SAMPS、CONST整数セット)。 (constの正規&REG)定期; 正規&演算子=(constのレギュラー&REG)。 仮想サンプラー*クローン()constは、 仮想空generate_samples(); }。 #endifの
クラスの実装:
#include "pch.h" の#include "regular.h" レギュラー::レギュラー():サンプラー(){ generate_samples()。 } 正規::〜レギュラー(){} 正規::レギュラー(CONST整数SAMPS):サンプラー(SAMPS){ generate_samples()。 } 正規::レギュラー(CONST整数SAMPS、CONST整数セット):サンプラー(SAMPS、セット){ generate_samples()。 } 正規::レギュラー(CONSTレギュラー&REG):サンプラー(REG){ generate_samples()。 } レギュラー・レギュラー::演算子=(constのレギュラー&REG){ IF(この==&REG) リターン*この; サンプラー::演算子=(REG)。 *これを返します。 } サンプラー*レギュラー::クローン()constは{ (* this)を新しい定期返します。 } ボイドレギュラー:: generate_samples(){ 整数N =(整数)のstd :: SQRT((ldouble)nsamples)。 {(; P <nsets P ++整数P = 0)のための (I ++ I = 0の整数; I <N)のため のために(J = 0の整数であり、j <nであり、j ++){ ポイント2 SP((J + 0.5)/ nは、(I + 0.5)/ N)。//均匀采样 samples.push_back(SP); } } }
テストサンプリングアルゴリズム:
サンプラークラスとサンプル数ViewPlaneカテゴリーに加え、増加関数(具体的に述べられていない場合、変更は繰返さない部分)
ボイドset_samples (CONST 整数N )。
空set_sampler (サンプラー*のconst SP );
次のようにViewPlane特定のクラスの宣言は次のとおりです。
一度に#pragma #ifndefの__VIEWPLANE_HEADER__ の#define __VIEWPLANE_HEADER__ の#include "../../Types.h" クラスサンプラー。 クラスViewPlane { パブリック: ViewPlane(); ViewPlane(定数ViewPlane&VP)。 ボイドset_hres(CONST整数時間)。 ボイドset_vres(CONST整数VR)。 空set_pixelsize(定数ldouble PS)。 空set_gamma(定数ldouble GA)。 ボイドset_samples(CONST整数n); //新增 空隙set_sampler(サンプラー* CONST SP); //新增 整数HRES。 VRES整数; 整数nsamples; //新增 ldouble秒; ldoubleグラム; サンプラー*サンプラー; //新增 }; #endifの
クラスメンバーを変更する必要があります。
#include "pch.h" の#include "viewplane.h" "../samplers/jittered.h"の#include ViewPlane :: ViewPlane():HRES(200)、VRES(100)、S(0.02)、G( 1)、nsamples(16)は、サンプラー(nullptr){} ViewPlane :: ViewPlane(CONST ViewPlane&VP) :HRES(vp.hres)、VRES(vp.vres)、S(vp.s)、G(vp.g )、nsamples(vp.nsamples)、サンプラー(vp.sampler){} ... 空隙ViewPlane :: set_samples(CONST整数n){//和书上不同、剔除特殊性、增加兼容性 nsamples = N。 sampler->()をクリアします。 sampler-> set_num_samples(nsamples)。 sampler-> setup_shuffled_indices(); sampler-> generate_samples(); } 無効ViewPlane :: set_sampler(サンプラー* constのSP){ (サンプラー= nullptr!){もし 削除サンプラー。 サンプラー= nullptr; nsamples = SP-> get_num_samples(); サンプラー= SP; }
ワールドクラスだけでビルドを変更し、部品をレンダリングします:
空の世界::ビルド(){ vp.set_hres(200); vp.set_vres(100)。 vp.set_sampler(新レギュラー()); //所有采样修改都在这里测试 tracer_ptr =新しいMultiSphere(この); 幾何学的形状* OBJ =新しいスフィア(0、0.5)。 obj-> SET_COLOR(てRGBColor(1、0、0)); add_object(OBJ)。 OBJ =新しいスフィア(Point3と(0、-100.5、0)、100)。 obj-> SET_COLOR(てRGBColor(0、0、1))。 add_object(OBJ)。 }
変更部分が繰り返されることはありません後にそうない限り、文の一部をレンダリングします。
空の世界::レンダリング(){ レイ線; ldouble X、Y。 OPEN_WINDOW(vp.hres、vp.vres)。 POINT3属; ray.o = Point3と(0、0、1)。 (整数R = vp.vres - 1、R> = 0; R - )のための//左コーナーから右コーナーにレンダリング するための(整数C = 0; C <vp.hres、C ++){ てRGBColor色; 以下のための(整数p = 0; p <vp.nsamples; p ++){//增加样本 SP = vp.sampler-> sample_unit_square(); X = vp.s *(C - 0.5 * vp.hres + sp.x)。 Y = vp.s *(R - 0.5 * vp.vres + sp.y)。 ray.d = Point3と(X、Y、-1)。 カラー+ = tracer_ptr-> trace_ray(光線); } カラー/ = vp.nsamples。 display_pixel(R、C、色)。 } }
修正後、プロシージャ動作、試験結果は、(増幅後と丸い角の多くは、我々は他のサンプリングアルゴリズムをテスト見出される)は以下の通りであります: