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); }
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); }
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); }
/*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; }
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)); }
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 ); }
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"); */ //******************* }