glm::vec3 SpecularReflectionBxDF::EvaluateScatteredEnergy(const glm::vec3 &wo, const glm::vec3 &wi, float& pdf) const
{
    pdf = PDF(wo, wi);
    if(isPerfectReflective(wo,wi))
        return reflection_color;
    else
        return glm::vec3(0);
}
Esempio n. 2
0
	RGBColour BxDF::Sample_F(const Vector3& p_wo, Vector3& p_wi, float p_u1, float p_u2, float& pdf) const {
		/* Cosine-sample the hempisphere, flipping the direction if necessary */
		p_wi = MonteCarlo::CosineSampleHemisphere(p_u1, p_u2);
		if (p_wo.z < 0.0f) p_wi.z *= -1.f;

		pdf = PDF(p_wo, p_wi);
		return F(p_wo, p_wi);
	}
Esempio n. 3
0
glm::vec3 BxDF::SampleAndEvaluateScatteredEnergy(const glm::vec3 &wo, glm::vec3 &wi_ret, float rand1, float rand2, float &pdf_ret) const
{

    glm::vec3 tmp = la::UnifSampleDisc(rand1, rand2);
    tmp.z = sqrtf(std::max(0.f, 1.f - tmp.x*tmp.x - tmp.y*tmp.y));

    if (wo.z < 0.f) tmp.z *= -1.f;

    wi_ret = tmp;
    pdf_ret = PDF(wo, wi_ret);
    return EvaluateScatteredEnergy(wo, wi_ret);
}
Esempio n. 4
0
/*PDF does *not* return _PDF.  It returns a vector of alternating slopes and
 * intercepts for the contained LinearSpaces.*/
LinearSpaceSource::ublas_vec_t LinearSpaceSource::PDF() const{
    ublas_vec_t PDF(_Space->size()*2);

    field_t::const_iterator SIter = _Space->begin();
    ublas_vec_t::iterator pdfIter = PDF.begin();
    for( ; SIter != _Space->end(); ++SIter, ++pdfIter ){
        *pdfIter = SIter->slope();
        ++pdfIter;
        *pdfIter = SIter->intercept();
    }
    return PDF;
}
Esempio n. 5
0
	Float pdf(const BSDFSamplingRecord &bRec, EMeasure measure) const {
		if (measure != ESolidAngle ||
			Frame::cosTheta(bRec.wi) <= 0 ||
			Frame::cosTheta(bRec.wo) <= 0 ||
			((bRec.component != -1 && bRec.component != 0) ||
			!(bRec.typeMask & EGlossyReflection)))
			return 0.0f;

		/* Calculate the reflection half-vector */
		Vector H = normalize(bRec.wo+bRec.wi);

		return PDF(H) / (4 * absDot(bRec.wo, H));
	}
Esempio n. 6
0
glm::vec3 BxDF::SampleAndEvaluateScatteredEnergy(const glm::vec3 &wo, glm::vec3 &wi_ret, float rand1, float rand2, float &pdf_ret) const
{
    //TODO
    rand1 *= TWO_PI;
    rand2 *= PI * .5f;

    float x( cosf( rand1 ) * sinf( rand2 ) );
    float y( sinf( rand1 ) * sinf( rand2 ) );
    float z( cosf( rand2 ) );

    wi_ret = glm::vec3( x, y, z );
    pdf_ret = PDF( wo, wi_ret );

    return EvaluateScatteredEnergy( wo, wi_ret );
}
glm::vec3 BlinnMicrofacetBxDF::SampleAndEvaluateScatteredEnergy(const glm::vec3 &wo, glm::vec3 &wi_ret, float rand1, float rand2, float &pdf_ret) const{

    float cos_theta( powf( rand1, 1.f / ( exponent + 1.f ) ) );
    float sin_theta( sqrtf( fmaxf( 0.f, 1.f - cos_theta * cos_theta ) ) );

    float phi( rand2 * TWO_PI );
    float cos_phi( cosf( phi ) );
    float sin_phi( sinf( phi ) );

    glm::vec3 wh( sin_theta * cos_phi, sin_theta * sin_phi, cos_theta );

    float woDwh( glm::dot( wo, wh ) );

    if( woDwh < 0.f ) wh = -wh;

    wi_ret = -wo + 2.f * woDwh * wh;
    pdf_ret = PDF( wo, wi_ret );

    return EvaluateScatteredEnergy( wo, wi_ret );
}
Esempio n. 8
0
float V(float t) {
   float cdf = CDF(t);
  return (cdf == 0) ? 0 : PDF(t) / cdf;
}
void demodulation(void)
{
	int i, j, u, v, index, value, rxword[n], bi_rxword[n*p];
	unsigned long int mask;
	float sum, proba[pointNum], maxValue;
	float Pr[p][2];

	//initializ
	for(u=0;u<q;u++)
		for(v=0;v<n;v++)
			RM[u][v]=0;

	//cal PDF
	for(i=0;i<n;i++)
	{	
		for(j=0;j<p;j++)
		{
			sum=0;
			for(u=0;u<pointNum;u++)
			{	
				proba[u]=PDF(i*p+j,u);
				sum+=proba[u];
			}

			Pr[j][0]=proba[0]/sum;	//proba-->00	0
			Pr[j][1]=proba[1]/sum;	//proba-->01	1

		}

		j=0;
		for(int z=0;z<pointNum;z++)
		for(u=0;u<pointNum;u++)
		for(v=0;v<pointNum;v++)
		for(int x=0;x<pointNum;x++)
		for(int y=0;y<pointNum;y++)
		for(int h=0;h<pointNum;h++)
		{
			RM[j][i]=(Pr[0][h]*Pr[1][y]*Pr[2][x]*Pr[3][v]*Pr[4][u]*Pr[5][z]);  
			j++;
		}
	
	}

	//find the rxword and bi_rxword
	for(j=0;j<n;j++)
	{
		maxValue=RM[0][j];
		index=0;
		for(i=1;i<q;i++)
			if(maxValue<RM[i][j])
			{
				maxValue=RM[i][j];
				index=i;
			}
			rxword[j]=root[index];
	}

	////convert to binary 
	//for(u=0;u<n*p;u++)	//n*4
	//	bi_rxword[u]=0;

	//for(u=0;u<n;u++)	//n
	//{
	//	value=rxword[u];
	//	mask=1;
	//	for(v=0;v<p;v++)
	//	{
	//		if((value & mask)>0)
	//			bi_rxword[p*u+v]=1;
	//		else
	//			bi_rxword[p*u+v]=0;
	//		mask=mask<<1;
	//	}
	//}
	
	//*********KV optimal rule**************
	float score_1=0;
	float score_2=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<q;j++)
		{
			if( codeword[i]==root[j] )
				score_1+=RM[j][i];
			
			if (RM[j][i])
				score_2+=(RM[j][i]*RM[j][i]);
		}
	}

	score_2=weiz*score_2;
	score_2 = pow( score_2,0.5f );

	if( score_1>score_2 )
	{
		for(u=0;u<n;u++)
			dec_codeword[u]=codeword[u];
		
		//for(u=0;u<n*p;u++)
		//	dec_bicodeword[u]=bi_codeword[u];
	}
	else
	{
		for(u=0;u<n;u++)
			dec_codeword[u]=rxword[u];
		//for(u=0;u<n*p;u++)
		//	dec_bicodeword[u]=bi_rxword[u];
	}
	//*************************************

/*
	for(j=0;j<n;j++)
	{
		maxValue=RM[0][j];
		index=0;
		for(i=1;i<q;i++)
			if(maxValue<RM[i][j])
			{
				maxValue=RM[i][j];
				index=i;
			}
			rxword[j]=root[index];
	}

	epcount1=0;
	for(i=0;i<n;i++)	//n
		if(rxword[i]!=codeword[i])
			epcount1++;
*/	
//	printf("\n\nepcount1=%d\n", epcount1);



/*	//*****debug**********
	printf("\n\ncodeword");
	for(v=0;v<n;v++)
		printf("\t%d",codeword[v]);

	printf("\n\nrxword\t");
	for(v=0;v<n;v++)
		printf("\t%d",rxword[v]);
	
	printf("\n\n");
	for(v=0;v<n*p/4;v++)
		printf("\t(%f,%f,%f,%f)",rx_symbol[v*2+0][0],rx_symbol[v*2+0][1],rx_symbol[v*2+1][0],rx_symbol[v*2+1][0]);

	printf("\n\n");
	for(u=0;u<q;u++)
	{
		printf("\n");
		printf("\t%d",root[u]);
		for(v=0;v<n;v++)
			printf("\t%f",RM[u][v]);
	}
	printf("\n\n");
*/	//*******************

}