Example 2 : Multi Sampling And Filtering Methods

来源:互联网 发布:洛瑞数据 编辑:程序博客网 时间:2024/05/17 08:45

#include<vector>#include<iostream>#include"Vector3.h"#include"rgb.h"#include"Image.h"#include"Shape.h"#include"Triangle.h"#include"Sphere.h"#include <fstream>#include "Sample.h"using namespace std;#define IMAGE_WIDTH512#define IMAGE_HEIGHT384#define NUM_SAMPLES16int main(){Image im(IMAGE_WIDTH, IMAGE_HEIGHT);int sample_type, r, c, s;Vector2* xySamples = new Vector2[NUM_SAMPLES];float x, y, total, tmp;ofstream singleFile("single.ppm");ofstream box_16File("box_16.ppm");Sample sampler;for (sample_type = 0; sample_type < 4; sample_type++){for (r = 0; r < IMAGE_HEIGHT; r++){for (c = 0; c < IMAGE_WIDTH; c++){switch (sample_type){case 0:for (s = 0; s < NUM_SAMPLES; s++){xySamples[s].setX(0);xySamples[s].setY(0);}break;case 1:// jitter 理解为: 为一个pixel, 产生NUM_SAMPLES个偏移值sampler.jitter(xySamples, NUM_SAMPLES);//sampler.multiJitter()// filter 理解为: 控制一个pixel,NUM_SAMPLES个偏移值的范围,从[0,1] -> [-0.5, 0.5]sampler.boxFilter(xySamples, NUM_SAMPLES);//sampler.cubicFilter()break;}// this is a 2D function defined  for sample locations in screen space,so it is evaluated directly instead of tracing rays. total = 0;for (s = 0; s < NUM_SAMPLES; s++){x = c + xySamples[s].x();y = r + xySamples[s].y();tmp = (x*x + y*y) / 100;total += 0.5f * (1.0f + (float)sin(tmp));}// 平均一个Pixel的颜色total /= NUM_SAMPLES;im.set(r, c, rgb(total, total, total));}}if (sample_type == 0){im.writePPM(singleFile);}else{im.writePPM(box_16File);}}}

0 0