Ejemplo n.º 1
0
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);

}
Ejemplo n.º 2
0
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));
}
Ejemplo n.º 3
0
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);
	//}

}
Ejemplo n.º 4
0
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));
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
void Assert_CheckFail( lpctstr pExp, lpctstr pFile, long lLine )
{
	throw CAssert(LOGL_CRIT, pExp, pFile, lLine);
}