void RayMarch::Update() { if(!m_computed) { // compute and viz m_fattal->Initialize(); Timer t; m_fattal->Compute(); std::cout << "[INFO] Computation done: " << t.getMilliseconds() << " ms\n"; m_fattal->InitializeVizualizer(this); m_computed = true; } CAssert(m_d_I != NULL); CAssert(m_d_density != NULL); CAssert(m_media != NULL); int argCpt = 1; gluLookAt(0.f, -3.f, 0.f, 0.f, 7.f, 0.f, 0.f, 0.f, 1.f); // We handle the trackball m_trackball.center = vcg::Point3f(0.f, 0.f, 0.f); m_trackball.radius =1.f; m_trackball.GetView(); m_trackball.Apply(false); // false to hide the trackball if (!m_media) return; m_kernel->setArg(argCpt++, *m_d_density); m_kernel->setArg(argCpt++, *m_d_I); m_kernel->setArg(argCpt++, m_media->Size.x); m_kernel->setArg(argCpt++, m_media->ScatteringCoeff); m_kernel->setArg(argCpt++, m_media->AbsorptionCoeff); // We need to send the camera information vcg::Matrix44f M = m_trackball.InverseMatrix(); vcg::Point4f camPos; camPos.SetZero(); camPos.Y() = -3.f; camPos.W() = 1.f; camPos = M * camPos; cl_float3 eye; eye.s[0] = camPos.X(); eye.s[1] = camPos.Y(); eye.s[2] = camPos.Z(); m_kernel->setArg(argCpt++, eye); vcg::Point4f up; up.X() = 0.f; up.Y() = 0.f; up.Z() = 1.f; up.W() = 0.f; up = M * up; cl_float3 up2; up2.s[0] = up.X(); up2.s[1] = up.Y(); up2.s[2] = up.Z(); m_kernel->setArg(argCpt++, up2); }
void LightEnv::createOpenCLBuffer(FattalAbstract* technique) { CAssert(m_lightdata == NULL); CAssert(technique->NbSamples <= 9); // for the moment m_image = new EnvMapImage(m_filename); m_mapvalues = m_image->CreateMapForLight(technique->NbSamples,1.0); // create light struct LightEnvStruct s; for (int i = 0; i < technique->NbSamples*technique->NbSamples; i++) s.values[i] = m_mapvalues[i]; CLMalloc(m_lightdata,CLM::get()->context(), CL_MEM_READ_WRITE, sizeof(LightEnvStruct)); CLCheck(CLM::get()->queue().enqueueWriteBuffer(*m_lightdata, CL_TRUE, 0, sizeof(LightEnvStruct),&s)); }
void FattalCPU::Compute() { CAssert(haveLight()); int nbElement = m_media->Size.x*m_media->Size.y*m_media->Size.z; memset(m_I, 0, nbElement*sizeof(SPECTRUM)); memset(m_Us[0], 0, nbElement*sizeof(SPECTRUM)*6); memset(m_Us[1], 0, nbElement*sizeof(SPECTRUM)*6); int idActiveU = 0; std::cout << "[INFO] LPM computation ... \n"; for (int idIteration = 0; idIteration < ScatteringOrder; idIteration++) { std::cout << "[INFO] Iteration : " << idIteration << std::endl; memset(m_Us[idActiveU], 0, nbElement*sizeof(SPECTRUM)*6); // Mettre a zero le buffer actif for (int idPropagation = 0; idPropagation < 6; idPropagation++) { ComputePropagation(idPropagation, idIteration == 0, idActiveU); } idActiveU = (idActiveU+1) % 2; } //if (m_renderStep) //{ // dynamic_cast<RenderCPUStep*>(m_renderStep)->UploadData(m_I); //} }
void LightFace::createOpenCLBuffer(FattalAbstract* technique) { CAssert(m_lightdata == NULL); LightFaceStruct* s = new LightFaceStruct; s->power = m_value/(technique->NbSamples*technique->NbSamples); //TODO s->idPropagation = m_direction; CLMalloc(m_lightdata,CLM::get()->context(), CL_MEM_READ_WRITE, sizeof(LightFaceStruct)); CLCheck(CLM::get()->queue().enqueueWriteBuffer(*m_lightdata, CL_TRUE, 0, sizeof(LightFaceStruct),(void*)s)); }
void FattalCPU::InitializeVizualizer( RayMarch* r ) { FattalAbstract::InitializeVizualizer(r); CAssert(m_I != NULL); ////////////////////////////////////////////////////////////////////////// // OpenCL initialisation ////////////////////////////////////////////////////////////////////////// int d_density_size = m_media->getTotalSize(); int d_density_datasize = d_density_size * sizeof(float); CLMalloc(m_d_density,CLM::get()->context(), CL_MEM_READ_WRITE, d_density_datasize); CLCheck(CLM::get()->queue().enqueueWriteBuffer(*m_d_density, CL_TRUE, 0, d_density_datasize, m_media->Density)); int d_I_size = m_media->getTotalSize(); int d_I_datasize = d_I_size * sizeof(float); CLMalloc(m_d_I,CLM::get()->context(), CL_MEM_READ_WRITE, d_I_datasize); CLCheck(CLM::get()->queue().enqueueWriteBuffer(*m_d_I, CL_TRUE, 0, d_I_datasize, m_I)); ////////////////////////////////////////////////////////////////////////// // RayMarch initialisation ////////////////////////////////////////////////////////////////////////// r->setOpenCLI(m_d_I); r->setOpenCLDensity(m_d_density); }
void Assert_CheckFail( lpctstr pExp, lpctstr pFile, long lLine ) { throw CAssert(LOGL_CRIT, pExp, pFile, lLine); }