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(); }