定期的なサンプリング・クラス定義とテスト

このアルゴリズムは、サンプラークラスから継承された均一なサンプリングアルゴリズム、です。

クラスの宣言:

一度の#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、色)。
		} 
}

  

修正後、プロシージャ動作、試験結果は、(増幅後と丸い角の多くは、我々は他のサンプリングアルゴリズムをテスト見出される)は以下の通りであります:

おすすめ

転載: www.cnblogs.com/dalgleish/p/12602750.html