Пример #1
0
void Bucket::sample(int x, int y)
{
    Vec3 sample = m_sampler->getSquareSample();
	int lightBounces = m_scene->m_settings.m_lightBounces;
	int cameraBounces = m_scene->m_settings.m_cameraBounces;
    Ray ray = m_viewPlane->getPixelRay(x,y,*m_sampler);
    RGBA finalCol(0.0f);
    RGBA col(0.0f);
	int numCameraNodes = 0;
	int numLightNodes = 1;

	buildPath(m_cameraPath,&ray,numCameraNodes, RGBA(1.0f,1.0f,1.0f,1.0f), 0, cameraBounces);

	int lightIndex = floor(m_sampler->get1DSample()*m_scene->m_lights.size());
	Light *light = m_scene->m_lights[lightIndex];
	ray = light->getRay(*m_sampler);
	m_lightPath[0].m_sr.m_hitPos = ray.m_origin;
	m_lightPath[0].m_accumColor = RGBA(1.0f,1.0f,1.0f,1.0f);

	for(int j=0;j<numCameraNodes;j++){
		PathNode &cameraNode = m_cameraPath[j];
		for(int i=0;i<numLightNodes;i++){
			PathNode &lightNode  =  m_lightPath[i];
			Vec3 dir = lightNode.m_sr.m_hitPos - cameraNode.m_sr.m_hitPos;
            float maxT = dir.length();
			dir.normalize();

			float delta = 0.001f;
			Vec3 tmp = dir * delta;
			tmp = cameraNode.m_sr.m_hitPos - tmp;
			Ray ray = Ray(tmp,dir,true);
			ray.computePlucker();


            float pdf;
            col =  light->getLightColor(dir, cameraNode.m_sr.m_hitPos, lightNode.m_sr.m_hitPos, &pdf);
			float shadeVal = float(m_scene->m_lights.size())/pdf;

            shadeVal *= m_scene->traceShadow(ray,maxT);
            col *= cameraNode.m_accumColor;
            cameraNode.m_sr.m_material->shade(cameraNode.m_incident, dir, cameraNode.m_sr, &col, m_shadingContext);
            col *= shadeVal;

            finalCol += col;
		}
	}
    if(numCameraNodes != 0){
        finalCol[3] = 1.0f;
    }
	else{
        finalCol = RGBA(0.0f,0.0f,0.0f,0.0f);
	}

    m_viewPlane->setPixelValue(x,y,finalCol);
}
Пример #2
0
void Instance::hit(Ray &ray, ShadeRec &sr) const
{
    const Triangle *tmpTriangle = sr.m_triangle;
    if(!sr.m_hit){
        tmpTriangle = 0;
    }
    Ray tmpRay = ray;
    m_transform.multDirMatrix(tmpRay.m_dir, tmpRay.m_dir);
    m_transform.multVecMatrix(tmpRay.m_origin, tmpRay.m_origin);
    tmpRay.computePlucker();
    m_bvh->hit(tmpRay, sr);
    if(sr.m_hit){
        if(sr.m_triangle != tmpTriangle){
            sr.m_hitPos = tmpRay.getPointAtPos(sr.m_hitT);
            sr.m_triangle->shadeInfo(tmpRay,sr);
            m_normalinvTransform.multDirMatrix(sr.m_normal, sr.m_normal);
            sr.m_normal.normalize();
            sr.m_calculated = true;
            sr.m_hitPos = ray.getPointAtPos(sr.m_hitT);
        }
    }
    return;
}