本文整理汇总了C++中HitInfo类的典型用法代码示例。如果您正苦于以下问题:C++ HitInfo类的具体用法?C++ HitInfo怎么用?C++ HitInfo使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了HitInfo类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Color
Color World::runPhotonCache(vec origin, vec direction) const {
HitInfo eyeInfo;
objects->hit(&eyeInfo, origin, direction);
if (!eyeInfo.hit)
return Color(0,0,0);
Color initc = eyeInfo.mat->getColor();
Color accum;
for (int d = 0; d < depth; d++) {
HitInfo newI;
newI.follow(eyeInfo);
vec newDirection = eyeInfo.mat->sample(eyeInfo.incoming, eyeInfo.normal);
objects->hit(&newI, eyeInfo.location, newDirection);
if (newI.hit) {
Color newc = initc * eyeInfo.mat->getColor() *
Color(1.0, 1.0, 1.0) *
eyeInfo.mat->sampledPdf(eyeInfo.incoming, newDirection, eyeInfo.normal);
accum += newc * pc->seenValue(eyeInfo.location, newI.location, &newI, sampleRadius) * (1.0 / depth);
}
}
return accum;
}
示例2: BeginRender
void BeginRender()
{
Color24 *temp;
temp = renderImage.GetPixels();
float *zBuffer = renderImage.GetZBuffer();
Color materialColor;
Color24 newColor;
for (int i = 0; i < camera.imgWidth; i++)
{
for (int j = 0; j < camera.imgHeight; j++)
{
Ray currentRay = ComputeCameraRay(i, j);
HitInfo hInfo;
hInfo.Init();
bool value = TraceRay(currentRay, hInfo, &rootNode);
if (value) {
hInfo.node->FromNodeCoords(hInfo);
const Material *m = hInfo.node->GetMaterial();
materialColor = m->Shade(currentRay, hInfo, lights);
temp[camera.imgWidth*j + i].r = (materialColor.r)*255;
temp[camera.imgWidth*j + i].g = (materialColor.g)*255;
temp[camera.imgWidth*j + i].b = (materialColor.b)*255;
}
else {
temp[camera.imgWidth*j + i].r = 0;
temp[camera.imgWidth*j + i].g = 0;
temp[camera.imgWidth*j + i].b = 0;
}
zBuffer[camera.imgWidth*j + i] = hInfo.z;
}
}
renderImage.ComputeZBufferImage();
renderImage.SaveImage("Output");
}
示例3: runTimePhotonCache
ColorTimeCache World::runTimePhotonCache(vec origin, vec direction) const {
ColorTimeCache ctc;
HitInfo eyeInfo;
objects->hit(&eyeInfo, origin, direction);
if (!eyeInfo.hit)
return ctc;
Color initc = eyeInfo.mat->getColor();
for (int d = 0; d < depth; d++) {
HitInfo newI;
newI.follow(eyeInfo);
vec newDirection = eyeInfo.mat->sample(eyeInfo.incoming, eyeInfo.normal);
objects->hit(&newI, eyeInfo.location, newDirection);
if (newI.hit) {
Color newc = initc * eyeInfo.mat->getColor() * (1.0/depth) *
eyeInfo.mat->sampledPdf(eyeInfo.incoming, newDirection, eyeInfo.normal);
ctc.addWeighted(newI.distance + eyeInfo.distance, newc,
pc->seenTimeValue(eyeInfo.location, newI.location, &newI, sampleRadius));
}
}
return ctc;
}
示例4: BeginRender
void BeginRender()
{
cout<<"\nBeginning Render...";
float alpha = camera.fov;
float l = 1.0;
float h = l * tan(alpha/2.0 *(M_PI/180));
float aspectRatio = (float)camera.imgWidth/camera.imgHeight;
float s = aspectRatio * h;
float dx = (2 * s)/camera.imgWidth;
float dy = -(2 * h)/camera.imgHeight;
float dxx = dx/2,dyy=dy/2;
Point3 K(-s,h,-l);
K.x += dxx;
K.y += dyy;
for(int i = 0; i< camera.imgHeight; i++){
for(int j = 0; j<camera.imgWidth; j++){
K.x += dx;
Matrix3 RotMat;
Point3 dvec = camera.dir - camera.pos;
Point3 svec = camera.up.Cross(dvec);
dvec.Normalize();
svec.Normalize();
camera.up.Normalize();
RotMat.Set(svec,camera.up, dvec);
Ray r(camera.pos, K);
r.dir=r.dir*RotMat;
r.dir.Normalize();
HitInfo hInfo;
hInfo.Init();
if(rootNode.GetNumChild()>0){
// for(int k=0; k < rootNode.GetNumChild(); ++k){
// RayTrace(rootNode.GetChild(k),r,i * camera.imgWidth + j);
// }
if(RayTrace_2(r, hInfo))
{
renderImage.PutPixel(i *camera.imgWidth+j, white, hInfo.z);
}
else renderImage.PutPixel(i *camera.imgWidth+j, black, BIGFLOAT);
}
}
K.x = -s;
K.x += dxx;
K.y += dy;
}
cout<<"Render Complete"<<endl;
renderImage.ComputeZBufferImage();
renderImage.SaveZImage("/Users/varunk/Desktop/RayTracerProj1/RayTracerProj1/zbuffer.ppm");
renderImage.SaveImage("/Users/varunk/Desktop/RayTracerProj1/RayTracerProj1/renderimage.ppm");
}
示例5: Shadow
float GenLight::Shadow(Ray ray, float t_max)
{
HitInfo hInfo;
hInfo.Init();
hInfo.z = t_max;
if (TraceRay(&rootNode, ray, hInfo, HIT_FRONT))
return 0.0f;
return 1.0f;
}
示例6: RandomSampler
void Renderer::calculatePixelColor(Node &i_rootNode, LightList &i_lightList, int offsetAlongWidth, int offsetAlongHeight)
{
HitInfo hitInfo;
Color noHitPixelColor = { 0,0,0 };
Color finalColor = { 0,0,0 };
RandomSampler sampler = RandomSampler(MIN_SAMPLE_COUNT, MAX_SAMPLE_COUNT, MIN_VARIANCE, MAX_VARIANCE);
while (sampler.needMoreSamples())
{
sampler.generateSamples(offsetAlongWidth, offsetAlongHeight);
for (int k = 0; k < sampler.getSampleBucketSize(); ++k)
{
hitInfo.Init();
Ray sampleRay = sampler.getSampleRay(k);
if (TraceRay(&i_rootNode, sampleRay, hitInfo))
{
finalColor = hitInfo.node->GetMaterial()->Shade(sampleRay, hitInfo,
i_lightList, REFLECTION_BOUNCE_COUNT, GI_BOUNCE_COUNT);
/*finalColor.r = pow(finalColor.r, 1/2.2);
finalColor.g = pow(finalColor.g, 1/2.2);
finalColor.b = pow(finalColor.b, 1/2.2);*/
sampler.setSampleColor(k, finalColor);
sampler.setIsSampleHit(k, true);
}
else
{
sampler.setSampleColor(k, background.Sample(sampleRay.dir));
}
sampler.setHitInfo(k, hitInfo);
}
}
Color tempColor = sampler.getAveragedSampleListColor();
tempColor.r = pow(tempColor.r, 1 / 2.2);
tempColor.g = pow(tempColor.g, 1 / 2.2);
tempColor.b = pow(tempColor.b, 1 / 2.2);
float depth = sampler.getAveragedDepth();
int sampleCount = sampler.getSampleBucketSize();
int pixel = offsetAlongHeight * imageWidth + offsetAlongWidth;
TCHAR* mutexName = __T("WritingMutex");
static HANDLE mutexHandle = NULL;
if( mutexHandle == NULL )
mutexHandle = OpenMutex(MUTEX_ALL_ACCESS, FALSE, mutexName);
DWORD dSuccess = WaitForSingleObject(mutexHandle, INFINITE);
assert(dSuccess == WAIT_OBJECT_0);
renderingImage[pixel] = tempColor;
operationCountImage[pixel] = Color(1.0f,0.0f,0.0f) * static_cast<float>(hitInfo.operationCount/BIGFLOAT);
zBufferImage[pixel] = depth;
sampleCountImage[pixel] = sampleCount;
bool bSuccess = ReleaseMutex(mutexHandle);
assert(bSuccess == true);
sampler.resetSampler();
}
示例7: RayTrace
bool RayTrace(HitInfo &hitInfo, Node* curnode, Ray ray, int PixIndex)
{
Node* node = curnode;
bool hitTest = false;
const Object *obj = node->GetObject();
ray = curnode->ToNodeCoords(ray);
if(obj){
// cout<<"Transforming to..."<<endl;
HitInfo tempHitInfo;
tempHitInfo.Init();
tempHitInfo.node = node;
tempHitInfo.z = hitInfo.z;
hitTest = obj->IntersectRay(ray, tempHitInfo);
node->FromNodeCoords(tempHitInfo);
if(hitTest && tempHitInfo.z < hitInfo.z){
hitInfo = tempHitInfo;
//cout<<hitInfo.z<<endl;
}
//else hitTest=false;
}
if(node->GetNumChild()>0)
{
//cout<<"Children "<<node->GetNumChild()<<endl;
for(int i=0;i<curnode->GetNumChild();++i)
{
// cout<<"Child "<<i<<endl;
node = curnode->GetChild(i);
HitInfo temp;
temp.Init();
temp = hitInfo;
if(RayTrace(hitInfo, node, ray, PixIndex)){
curnode->FromNodeCoords(hitInfo);
// cout<<"Transforming from "<<curnode->GetNumChild()<<endl;
if(temp.z > hitInfo.z) hitTest = true;
else{
// hitInfo = temp;
hitTest = false;
continue;
}
}
}
}
if(hitTest) return true;
else return false;
}
示例8:
const Vector3 Lambert::shade(const unsigned int threadID, const Ray& ray, const HitInfo &hit, const Scene& scene, bool isSecondary) const
{
Vector3 L = Vector3(0.0f, 0.0f, 0.0f);
Vector3 rayD = Vector3(ray.d[0],ray.d[1],ray.d[2]); // Ray direction
Vector3 viewDir = -rayD; // View direction
float u, v;
Vector3 N, geoN, T, BT;
Vector3 diffuseColor = m_kd;
Vector3 P = ray.getPoint(hit.t);
hit.getAllInfos(N, geoN, T, BT, u, v);
if (m_colorMap != NULL)
{
Vector4 texCol = m_colorMap->getLookup(u, v);
diffuseColor = Vector3(texCol.x, texCol.y, texCol.z);
}
const Lights *lightlist = scene.lights();
// loop over all of the lights
Lights::const_iterator lightIter;
for (lightIter = lightlist->begin(); lightIter != lightlist->end(); lightIter++)
{
float discard;
Vector3 lightPower = (*lightIter)->sampleLight(threadID, P, N, ray.time, scene, 0, discard);
L += lightPower * diffuseColor; // Calculate Diffuse component
}
// add the ambient component
L += m_ka;
return L;
}
示例9: doRender
void doRender(void* arg){
RenderParams rarg = *((RenderParams *)arg);
//cout<<"Do render...."<<endl;
bool pixelHit=false;
HitInfo hitInfo;
hitInfo.Init();
Point2 pixLoc = rarg.pixLocation;
Ray r = rarg.ray;
int PixIndex = rarg.pixIndex;
Color shade(255,255,255);
if(rootNode.GetNumChild()>0){
if(RayTrace_2(r, hitInfo)) {
pixelHit=true;
// cout<<"Shading...."<<endl;
shade = hitInfo.node->GetMaterial()->Shade(r, hitInfo, lights, 5);
}
renderImage.PutPixel(PixIndex, shade, hitInfo.z);
}
if(!pixelHit){
renderImage.PutPixel(PixIndex, black, BIGFLOAT);
}
// RenderParams renderArg = giveMeAPixelToRender();
// if(renderArg.renderComplete != 1){
// doRender(&renderArg);
// }
//
}
示例10: Color
Color MtlBlinn::Shade(const Ray &ray, const HitInfo &hInfo, const LightList &lights, int bounceCount) const{
float bias = BIAS_SHADING;
Color shade;
Color rShade = Color(0,0,0);
Color tShade = Color(0,0,0);
const Material *mat;
mat = hInfo.node->GetMaterial();
const MtlBlinn* mb =static_cast<const MtlBlinn*>(mat);
// cout<<"HInfo front: "<<hInfo.front<<endl;
/* local copy */
Point3 P;
P.Set(hInfo.p.x,hInfo.p.y,hInfo.p.z);
Ray iRay = ray;
Color ambInt = mb->diffuse;
Color allOther = Color(0,0,0);
Color diffuse = mb->diffuse;;
Color ambComponent = Color(0,0,0);
for ( unsigned int i=0; i<lights.size(); i++ ) {
if(lights[i]->IsAmbient()){
// cout<<"ambient "<<endl;
Color intensity = lights[i]->Illuminate(hInfo.p);
ambComponent += (ambInt * intensity);
continue;
}
else{
// cout<<"other lighting "<<endl;
Point3 L = -lights[i]->Direction(P);
L.Normalize();
Point3 V = ray.p - P;
V.Normalize();
Point3 LplusV = L + V;
Point3 H = (L+V)/LplusV.Length();
H.Normalize();
float alpha = mb->glossiness;
Point3 N = hInfo.N;
float S = H.Dot(N);
S = pow(S,alpha);
float costheta = L.Dot(N)/(L.Length() * N.Length());
Color intensity = lights[i]->Illuminate(P);
// cout<<"costheta "<<endl;
allOther += intensity * (costheta>0?costheta:0) * (diffuse + S * (mb->specular)) ;
}
/* finally add inta*cola + intall*costheta*(cold + s* colS)*/
shade = ambComponent + allOther;
}
/* Calculate refraction */
if(refraction.Grey()>0 && bounceCount>0){
Color reflShade = Color(0,0,0);
float R0, Refl = 0.0f, Trans = 0.0f;
HitInfo temp;
temp.Init();
Point3 N = hInfo.N;
// Point3 V = Point3(iRay.p.x - hInfo.p.x, iRay.p.y - hInfo.p.y, iRay.p.z - hInfo.p.z);
Point3 V = Point3(hInfo.p.x - iRay.p.x, hInfo.p.y - iRay.p.y, hInfo.p.z - iRay.p.z);
V.Normalize();
float n1 = 1, n2 = 1;
if(hInfo.front){ /* Hitting from outside */
// temp.front = false;
n2 = ior;
// cout<<"outside "<<endl;
}
else if(!hInfo.front){ /* Transmission from the inside */
// temp.front = true;
n1 = ior;
// cout<<"intside... "<<endl;
N = -hInfo.N;
}
float ratio_n = n1 / n2;
float costheta_v = -V.Dot(N); /* refer: http://graphics.stanford.edu/courses/cs148-10-summer/docs/2006--degreve--reflection_refraction.pdf */
float sin2theta_t = ratio_n * ratio_n * (1 - costheta_v * costheta_v);
Point3 T = ratio_n * V + (ratio_n * costheta_v - sqrtf(1 - sin2theta_t)) * N ;
// cout<<ratio_n<<" "<<"cos_v "<<costheta_v<<" sin2theta_t "<<sin2theta_t<<endl;
Ray tRay = Ray(hInfo.p,T);
//tRay.dir.Normalize();
tRay.p.x = tRay.p.x + bias *tRay.dir.x; /* add bias */
tRay.p.y = tRay.p.y + bias *tRay.dir.y;
tRay.p.z = tRay.p.z + bias *tRay.dir.z;
// cout<<"B temp front: "<< temp.front<<endl;
if(sin2theta_t <= 1){
if(RayTrace_2(tRay, temp)){
// bounceCount--;
// cout<<"A temp front: "<< temp.front<<endl;
tShade = temp.node->GetMaterial()->Shade(tRay,temp,lights,bounceCount);
tShade.r *= exp(-absorption.r * temp.z);
tShade.g *= exp(-absorption.g * temp.z);
tShade.b *= exp(-absorption.b * temp.z);
// shade = tShade; /* remove later */
// return shade;
//.........这里部分代码省略.........
示例11: intersects
Colour SceneNode::get_colour(Point3D origin, Vector3D dir, const Colour& ambient,
const Colour& bg, const std::list<Light*>& lights,
int num_glossy_rays, int limit) {
HitInfo info = intersects(origin, dir);
if (!info.empty() && limit > 0) {
Hit closest = info.get_closest();
Material* close_mat = closest.material;
Colour c(0.0, 0.0, 0.0);
for (std::list<Light*>::const_iterator it = lights.begin(); it != lights.end(); ++it) {
Vector3D shadow_ray = (*it)->position - closest.intersection;
HitInfo shadow_info = intersects(closest.intersection, shadow_ray);
closest = close_mat->apply_material(-dir, *it, closest);
if (!shadow_info.empty()) {
std::vector<Hit> all_hits = shadow_info.get_all_hits();
int num_translucent = 0;
Colour shadow(0.0, 0.0, 0.0);
for (unsigned int i = 0; i < all_hits.size(); i++) {
Hit h = all_hits.at(i);
if (!h.in_shadow) {
if (num_translucent == 0) {
shadow = shadow + closest.diffuse;
num_translucent = 1;
}
break;
} else {
if ((h.material)->get_transparency() > 0.0) {
shadow = shadow + (h.material)->get_transparency() * closest.diffuse;
num_translucent++;
} else {
num_translucent = 0;
break;
}
}
}
if (num_translucent > 0) {
c = c + (1.0 / num_translucent) * shadow;
c = c + closest.specular;
}
} else {
c = c + closest.diffuse;
c = c + closest.specular;
}
}
if ((closest.material)->should_reflect()) {
Vector3D V = dir, N = closest.normal;
V.normalize(); N.normalize();
Vector3D reflected = V - (2 * V.dot(N) * N);
Colour r = get_colour(closest.intersection, reflected, ambient, bg, lights,
num_glossy_rays, limit - 1);
if (num_glossy_rays > 0) {
Vector3D w = reflected;
w.normalize();
Vector3D u = w.cross(Vector3D(1.0, 0.0, 0.0));
u.normalize();
Vector3D v = w.cross(Vector3D(0.0, 1.0, 0.0));
v.normalize();
for (int i = 0; i < num_glossy_rays; i++) {
double dx = 0.0;
double dy = 0.0;
while (dx == 0.0 && dy == 0.0) {
dx = ((double)(rand() % 100) / 100.0) * 0.125;
dy = ((double)(rand() % 100) / 100.0) * 0.125;
}
Vector3D refi = reflected + dx * u + dy * v;
if (refi.dot(closest.normal) < 0) {
refi = -refi;
}
Colour ri = get_colour(closest.intersection, refi, ambient, bg, lights,
num_glossy_rays, limit - 1);
r = r + ri;
}
r = (double) (1.0 / (num_glossy_rays + 1)) * r;
}
c = 0.7 * c + 0.3 * close_mat->get_reflect(r);
}
Vector3D refracted;
if (close_mat->should_refract() && close_mat->get_transmit_ray(refracted, dir, closest)) {
Colour refr = get_colour(closest.intersection, refracted, ambient, bg, lights,
num_glossy_rays, limit + 1);
c = c + close_mat->get_transparency() * refr;
}
c = c + (1.0 - close_mat->get_transparency()) * close_mat->get_ambient(ambient);
return c;
} else {
return bg;
}
}
示例12: ray
void PhotonTracer::traceSinglePhoton(IPhotonMap& photonMap, int photonCount) const {
float randomVector[RANDOM_DIMENSION];
randomSet_->nextf(randomVector);
Spectrum power;
ray3f ray(light_->samplePhoton(
power,
vec2f(
Lcg::global().nextf(),
Lcg::global().nextf()),
vec2f(
randomAt(randomVector, 0),
randomAt(randomVector, 1))));
power /= static_cast<float>(photonCount); // split power
HitInfo hit = HitInfo::createUninitialized();
float currentRefractiveIndex = 1;
int bounceCount = 0;
while( scene_->raytrace(ray, hit) ) {
if(bounceCount > 0) {
Photon photon(
hit.position(),
hit.normal(),
power);
photonMap.add(photon);
}
Material const& material = hit.material();
if(material.getType() == Material::MATERIAL_DIFFUSE) {
float u = Lcg::global().nextf();
// Russian roulette.
if(u <= material.getReflectance().average()) {
power *= material.getReflectance()
/ material.getReflectance().average();
ray = ray3f(
hit.position(),
Hemisphere::cosineWeightedDirection(
hit.normal(),
randomAt(randomVector, 2+2*bounceCount),
randomAt(randomVector, 3+2*bounceCount)));
} else {
break;
}
} else if(material.getType() == Material::MATERIAL_SPECULAR) {
float u = Lcg::global().nextf();
// Russian roulette.
if(u <= material.getReflectance().average()) {
power *= material.getReflectance()
/ material.getReflectance().average();
ray = ray3f(
hit.position(),
Hemisphere::mirrorReflection(
hit.normal(),
ray.getDirection()));
} else {
break;
}
} else if(material.getType() == Material::MATERIAL_DIELECTRIC) {
float fresnel = Hemisphere::fresnelCoefficient(
hit.normal(), ray.getDirection(),
currentRefractiveIndex,
material.getRefractiveIndex());
float u = Lcg::global().nextf();
if(u < 1 - fresnel) {
// refraction
vec3f excitantDirection;
if( Hemisphere::computeRefraction(
hit.normal(), ray.getDirection(),
currentRefractiveIndex,
material.getRefractiveIndex(),
excitantDirection) ) {
ray = ray3f(
hit.position(),
excitantDirection);
currentRefractiveIndex = material.getRefractiveIndex();
} else {
// total internal reflection
ray = ray3f(
hit.position(),
Hemisphere::mirrorReflection(
hit.normal(),
ray.getDirection()));
//.........这里部分代码省略.........
示例13: createCache
void World::createCache() {
Thing *emitter;
HitInfo c;
int length =0;
int resetcount = 1;
HitInfo emtInfo;
vec emtN;
vec source;
emitter = emitters[Random::upto(emitters.size())];
source = emitter->randomSurfacePoint(emtN);
emtInfo.hit = true;
emtInfo.incoming = emtN;
emtInfo.normal = emtN;
emtInfo.location = source;
emtInfo.mat = emitter->getMaterial();
colorcache.push_back(emitter->getMaterial()->getColor());
hicache.push_back(emtInfo);
bool done = false;
for (int d = 1; d < cacheSize; d++) {
int i = d - 1;
double ints = colorcache[i].intensity();
if (ints < .01 || length > 60 || done) {
emitter = emitters[Random::upto(emitters.size())];
source = emitter->randomSurfacePoint(emtN);
emtInfo.distance = 0;
emtInfo.previousDistances = 0;
emtInfo.hit = true;
emtInfo.incoming = emtN;
emtInfo.normal = emtN;
emtInfo.location = source;
emtInfo.mat = emitter->getMaterial();
int intes = 1;//emitter->getMaterial()->getColor().intensity() + 1;
for (int x=0; x<intes; x++) {
colorcache.push_back(emitter->getMaterial()->getColor() * (1.0/intes));
hicache.push_back(emtInfo);
}
resetcount++;
d += intes-1;
done = false;
length = 0;
continue;
}
length++;
HitInfo newI;
newI.follow(hicache[d-1]);
vec newDirection = hicache[d-1].mat->sample(hicache[d-1].incoming, hicache[d-1].normal);
objects->hit(&newI, hicache[d-1].location, newDirection);
if (newI.hit) {
Color newc = hicache[d-1].mat->combineColor(colorcache[d-1] *
hicache[d-1].mat->sampledPdf(hicache[d-1].incoming, newDirection, hicache[d-1].normal));
int intes = 1;//newc.intensity()*3 + 1;
for (int x=0; x<intes; x++) {
hicache.push_back(newI);
colorcache.push_back(newc * (1.0/intes));
}
d += intes-1;
}
else {
done = true;
d--;
}
}
cacheweight = (cacheSize * 1.0 / resetcount);
}
示例14: runCache
ColorTimeCache World::runCache(vec origin, vec direction) const {
ColorTimeCache accum;
std::vector<Color> cumEyeWeight;
std::vector<HitInfo> eyeHits;
std::vector<int> todo;
std::vector<double> mult;
todo.reserve(depth);
cumEyeWeight.reserve(depth); //8s without, 8s with, but should make a difference.
eyeHits.reserve(depth);
mult.reserve(depth);
HitInfo eyeInfo;
objects->hit(&eyeInfo, origin, direction);
bool done = false;
if (!eyeInfo.hit)
return accum;
Color newc = eyeInfo.mat->getColor();
int ints = 1;//newc.intensity() * (depth/2) + 1;
for (int x=0; x<ints; x++)
todo.push_back(eyeHits.size());
cumEyeWeight.push_back(newc);
eyeHits.push_back(eyeInfo);
mult.push_back(1.0/ints);
for (int d = 1; d < depth && !todo.empty(); d++) {
HitInfo newI;
int index = todo.back();
todo.pop_back();
newI.follow(eyeHits[index]);
vec newDirection = eyeHits[index].mat->sample(eyeHits[index].incoming, eyeHits[index].normal);
objects->hit(&newI, eyeHits[index].location, newDirection);
if (newI.hit) {
Color newc = newI.mat->combineColor(
cumEyeWeight[index] * eyeHits[index].mat->sampledPdf(
eyeHits[index].incoming, newDirection, eyeHits[index].normal));
// newc *= mult[index];
int ints = 1;//newc.intensity() * (depth/2) + 1;
for (int x=0; x<ints; x++)
todo.push_back(eyeHits.size());
eyeHits.push_back(newI);
cumEyeWeight.push_back(newc);
mult.push_back(1.0/ints);
}
else
done = true;
}
for (int x=0; x<depth; x++) {
for (int y=0; y<eyeHits.size(); y++) {
int index = Random::upto(cacheSize);
vec dir = eyeHits[y].location - hicache[index].location;
double dist = dir.magnitude();
if (dist < EPSILON)
continue;
dir.normalize();
HitInfo inf;
inf.distanceOnly = true;
inf.distance = dist;
objects->hit(&inf, hicache[index].location, dir);
if (inf.distance >= dist - EPSILON || !inf.hit) {
//hit
Color result = cumEyeWeight[y] * colorcache[index] * cacheweight *
eyeHits[y].mat->pdf(eyeHits[y].incoming, dir * -1, eyeHits[y].normal) *
hicache[index].mat->pdf(hicache[index].incoming, dir, hicache[index].normal) * (1/BOUNCE_MULT);
accum.addSample(hicache[index].distance + hicache[index].previousDistances
+ eyeHits[y].distance + eyeHits[y].previousDistances + inf.distance, result);
}
}
}
return accum;
}
示例15: Color
Color MtlBlinn::Shade(const Ray &ray, const HitInfo &hInfo, const LightList &lights, int reflection_bounceCount, int gi_bounceCount) const
{
Color ambientComp, diffuseComp, specularComp, reflectiveComp, refractiveComp, reflectionTotal, refractionTotal, noColor, diffuseReflection;
diffuseReflection = ambientComp = diffuseComp = specularComp = reflectiveComp = refractiveComp = noColor = reflectionTotal = refractionTotal = Color(0.0f, 0.0f, 0.0f);
Color fromReflection = Color(0.0f, 0.0f, 0.0f);
Color fromRefraction = Color(0.0f, 0.0f, 0.0f);
Point3 viewDirection = -ray.dir;
float schlicksConstant, ratioOfRefraction;
Color kd = diffuse.Sample(hInfo.uvw);
int hitside = HIT_FRONT;
float n1 = 1;
float n2 = ior;
for (int i = 0; i < lights.size(); i++)
{
Color lightColor = lights[i]->Illuminate(hInfo.p, hInfo.N);
/*if (lightColor != noColor)
{*/
if (lights[i]->IsAmbient())
{
ambientComp = ambientComponent(lights[i], lightColor, hInfo, diffuse.Sample(hInfo.uvw));
}
else
{
//lightColor.ClampMinMax();
Point3 rayDir = ray.dir;
globalPhotonMap.EstimateIrradiance<50>(lightColor, rayDir, 2.0f, hInfo.p, &hInfo.N);
diffuseComp = diffuseComponent(lights[i], lightColor, hInfo, diffuse.Sample(hInfo.uvw));
specularComp = specularComponent(lights[i], lightColor, viewDirection, hInfo, specular.Sample(hInfo.uvw), glossiness);
}
//}
}
/************************Refraction************************************************************/
if(refraction.Sample(hInfo.uvw) != noColor && reflection_bounceCount > 0)
{
Ray refractionRay;
HitInfo refractionRayHit;
refractionRayHit.Init();
refractionRay.p = hInfo.p;
if (hInfo.front == HIT_FRONT)
{
refractionRay.dir = getRefractionVector(viewDirection, getPerturbedNormal(hInfo.N, hInfo.p, refractionGlossiness), n1, n2);
}
else
{
refractionRay.dir = getRefractionVector(viewDirection, getPerturbedNormal( -hInfo.N, hInfo.p, refractionGlossiness), n2, n1);
}
if(TraceRay(&rootNode, refractionRay, refractionRayHit, hitside))
{
Point3 refractionDir = refractionRay.dir;
refractiveComp += refractionRayHit.node->GetMaterial()->Shade(refractionRay, refractionRayHit,
lights, --reflection_bounceCount);
refractiveComp *= refraction.Sample(hInfo.uvw);
}
else
{
refractiveComp = environment.SampleEnvironment(refractionRay.dir);
}
}
/********************Schlick's Approximation - Fresnel Reflection***************************/
schlicksConstant = pow(((n1 - n2) / (n1 + n2)), 2);
ratioOfRefraction = schlicksConstant + (1 - schlicksConstant) * pow((1 - viewDirection.Dot(hInfo.N)), 5);
reflectionTotal = ratioOfRefraction*refraction.Sample(hInfo.uvw);
refractionTotal = (1 - ratioOfRefraction)*refraction.Sample(hInfo.uvw);
///*******************************************************************************************/
//refractiv eComp *= refractionTotal; //It = (1-R) * KT'
reflectionTotal += reflection.Sample(hInfo.uvw); //Doing outside in case refraction didn't occured at all
/*********************************************************************************************/
/**********************Reflection*************************************************************/
if(reflectionTotal != noColor && reflection_bounceCount > 0)
{
Ray reflectionViewVector;
reflectionViewVector.dir = getReflectionVector(viewDirection,
getPerturbedNormal(hInfo.N, hInfo.p, reflectionGlossiness));
reflectionViewVector.p = hInfo.p;
HitInfo reflectionRayHit;
reflectionRayHit.Init();
//--reflection_bounceCount;
if (TraceRay(&rootNode, reflectionViewVector, reflectionRayHit, HIT_FRONT))
{
fromReflection += reflectionRayHit.node->GetMaterial()->Shade(reflectionViewVector,
reflectionRayHit, lights, --reflection_bounceCount);
reflectiveComp = reflectionTotal * fromReflection;
}
else
{
reflectiveComp = environment.SampleEnvironment(reflectionViewVector.dir);
}
}
/****************************************************************************************************/
if(GI_ALGO)
{
if (kd != noColor && gi_bounceCount > 0)
{
HemiSphereSampler giHemiSampler = HemiSphereSampler(__gi_sampleCount, __gi_sampleCount, 1);
//.........这里部分代码省略.........