Beispiel #1
0
void GaussFilter::gaussFilter(cv::Mat &image, int radius){
	cv::Mat img(image.size(), CV_64F);
	double *kernel = new double[radius * 2 + 1];
	genKernel(kernel, radius);
	image.copyTo(img);

	for(int row = 0; row < image.size().height; row++){
		for(int col = 0; col < image.size().width; col++){
			double r = 0, g = 0, b = 0;
			for(int i = -radius; i <= radius; i++){
				int c_col = col + i;
				if(c_col < 0)
					c_col *= -1;
				else if(c_col > image.size().width - 1)
					c_col = 2 * (image.size().width - 1) - c_col;

				b += image.at<cv::Vec3b>(row, c_col).val[0] * kernel[i + radius];
				g += image.at<cv::Vec3b>(row, c_col).val[1] * kernel[i + radius];
				r += image.at<cv::Vec3b>(row, c_col).val[2] * kernel[i + radius];
			}
			img.at<cv::Vec3b>(row, col).val[0] = (int)b;
			img.at<cv::Vec3b>(row, col).val[1] = (int)g;
			img.at<cv::Vec3b>(row, col).val[2] = (int)r;
		}
	}
	image = img.t();
	image.copyTo(img);

	for(int row = 0; row < image.size().height; row++){
		for(int col = 0; col < image.size().width; col++){
			double r = 0, g = 0, b = 0;
			for(int i = -radius; i <= radius; i++){
				int c_col = col + i;
				if(c_col < 0)
					c_col *= -1;
				else if(c_col > image.size().width - 1)
					c_col = 2 * (image.size().width - 1) - c_col;

				b += image.at<cv::Vec3b>(row, c_col).val[0] * kernel[i + radius];
				g += image.at<cv::Vec3b>(row, c_col).val[1] * kernel[i + radius];
				r += image.at<cv::Vec3b>(row, c_col).val[2] * kernel[i + radius];
			}
			img.at<cv::Vec3b>(row, col).val[0] = (int)b;
			img.at<cv::Vec3b>(row, col).val[1] = (int)g;
			img.at<cv::Vec3b>(row, col).val[2] = (int)r;
		}
	}
	image = img.t();
	delete kernel;
}
//==============================================================================
void Ssao::initInternal(const ConfigSet& config)
{
	m_enabled = config.get("pps.ssao.enabled");

	if(!m_enabled)
	{
		return;
	}

	m_blurringIterationsCount = 
		config.get("pps.ssao.blurringIterationsCount");

	//
	// Init the widths/heights
	//
	const F32 quality = config.get("pps.ssao.renderingQuality");

	m_width = quality * (F32)m_r->getWidth();
	alignRoundUp(16, m_width);
	m_height = quality * (F32)m_r->getHeight();
	alignRoundUp(16, m_height);

	//
	// create FBOs
	//
	createFb(m_hblurFb, m_hblurRt);
	createFb(m_vblurFb, m_vblurRt);

	//
	// noise texture
	//
	GlCommandBufferHandle cmdb;
	cmdb.create(&getGlDevice());

	GlClientBufferHandle noise;
	noise.create(
		cmdb, sizeof(Vec3) * NOISE_TEX_SIZE * NOISE_TEX_SIZE, nullptr);

	genNoise((Vec3*)noise.getBaseAddress(), 
		(Vec3*)((U8*)noise.getBaseAddress() + noise.getSize()));

	GlTextureHandle::Initializer tinit;

	tinit.m_width = tinit.m_height = NOISE_TEX_SIZE;
	tinit.m_target = GL_TEXTURE_2D;
	tinit.m_internalFormat = GL_RGB32F;
	tinit.m_format = GL_RGB;
	tinit.m_type = GL_FLOAT;
	tinit.m_filterType = GlTextureHandle::Filter::NEAREST;
	tinit.m_repeat = true;
	tinit.m_mipmapsCount = 1;
	tinit.m_data[0][0] = noise;

	m_noiseTex.create(cmdb, tinit);

	//
	// Kernel
	//
	String kernelStr(getAllocator());
	Array<Vec3, KERNEL_SIZE> kernel;

	genKernel(kernel.begin(), kernel.end());
	kernelStr = "vec3[](";
	for(U i = 0; i < kernel.size(); i++)
	{
		String tmp(getAllocator());

		tmp.sprintf("vec3(%f, %f, %f) %s",
			kernel[i].x(), kernel[i].y(), kernel[i].z(),
			(i != kernel.size() - 1) ? ", " : ")");

		kernelStr += tmp;
	}

	//
	// Shaders
	//
	m_uniformsBuff.create(cmdb, GL_SHADER_STORAGE_BUFFER, 
		sizeof(ShaderCommonUniforms), GL_DYNAMIC_STORAGE_BIT);

	String pps(getAllocator());

	// main pass prog
	pps.sprintf(
		"#define NOISE_MAP_SIZE %u\n"
		"#define WIDTH %u\n"
		"#define HEIGHT %u\n"
		"#define KERNEL_SIZE %u\n"
		"#define KERNEL_ARRAY %s\n",
		NOISE_TEX_SIZE, m_width, m_height, KERNEL_SIZE, &kernelStr[0]);

	m_ssaoFrag.loadToCache(&getResourceManager(),
		"shaders/PpsSsao.frag.glsl", pps.toCString(), "r_");


	m_ssaoPpline = m_r->createDrawQuadProgramPipeline(
		m_ssaoFrag->getGlProgram());

	// blurring progs
	const char* SHADER_FILENAME = 
		"shaders/VariableSamplingBlurGeneric.frag.glsl";

	pps.sprintf(
		"#define HPASS\n"
		"#define COL_R\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES 7\n", 
		m_height);

	m_hblurFrag.loadToCache(&getResourceManager(),
		SHADER_FILENAME, pps.toCString(), "r_");

	m_hblurPpline = m_r->createDrawQuadProgramPipeline(
		m_hblurFrag->getGlProgram());

	pps.sprintf(
		"#define VPASS\n"
		"#define COL_R\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES 7\n", 
		m_width);

	m_vblurFrag.loadToCache(&getResourceManager(),
		SHADER_FILENAME, pps.toCString(), "r_");

	m_vblurPpline = m_r->createDrawQuadProgramPipeline(
		m_vblurFrag->getGlProgram());

	cmdb.flush();
}