本文整理汇总了C++中Vec3f::Clamp方法的典型用法代码示例。如果您正苦于以下问题:C++ Vec3f::Clamp方法的具体用法?C++ Vec3f::Clamp怎么用?C++ Vec3f::Clamp使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vec3f
的用法示例。
在下文中一共展示了Vec3f::Clamp方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: find_color
Vec3f find_color(Ray ray,Hit hit,Group* group,Camera* camera)
{
int num_lights = sceneParser->getNumLights();
Vec3f cambient = sceneParser->getAmbientLight();
if (group->intersect(ray, hit, camera->getTMin()))//撞到了
{
Vec3f cobject = hit.getMaterial()->getDiffuseColor();
Vec3f canswer = cambient * cobject;
Vec3f clight;
Vec3f light_dir;
Vec3f normal_dir = hit.getNormal();
float distolight;
for (int i = 0; i < num_lights; i++)
{
Light *light = sceneParser->getLight(i);
//light_dir : the direction to the light
// 该方法用于获得指向光的方向,光的颜色,和到达光的距离
light->getIllumination(hit.getIntersectionPoint(), light_dir, clight, distolight);
//cpixel = cambient * cobject + SUMi [ clamped(Li . N) * clighti * cobject ]
//返回局部光
canswer = canswer + hit.getMaterial()->Shade(ray, hit, light_dir, clight)*cobject;
canswer.Clamp();
}
return canswer;
}
else
return sceneParser->getBackgroundColor();
}
示例2: traceRay
//.........这里部分代码省略.........
canswer = cambient * cobject;
Vec3f clight;//光的颜色
Vec3f light_dir;//指向光的方向
Vec3f normal_dir = hit.getNormal();//交点法线向量
float distolight;//距离光源的距离
for (int i = 0; i < num_lights; i++)
{
Light *light = sceneParser->getLight(i);
//light_dir : the direction to the light
// 该方法用于获得指向光的方向,光的颜色,和到达光的距离
// 第一个参数传递的是焦点信息
light->getIllumination(hitPoint, light_dir, clight, distolight);
Ray ray2(hitPoint, light_dir);
Vec3f init_normal(0, 0, 0);
Hit hit2(distolight, NULL, init_normal);
//阴影检测
if (shadow)
{
if (group->intersect(ray2, hit2, tmin)){
RayTree::AddShadowSegment(ray2, 0, hit2.getT());
continue;
}
RayTree::AddShadowSegment(ray2, 0, hit2.getT());
}
//cpixel = cambient * cobject + SUMi [ clamped(Li . N) * clighti * cobject ]
//返回局部光
canswer = canswer + hit.getMaterial()->Shade(ray, hit, light_dir, clight);
}
//printf("当前已有光线:\n");
//RayTree::Print();
//反射光
Material *material = hit.getMaterial();
Vec3f rc = material->getReflectiveColor();
if (rc.r() > 0 && rc.g() > 0 && rc.b() > 0)
{
Vec3f mirrorDir;
Vec3f incoming = ray.getDirection();
mirrorDir = mirrorDirection(normal_dir, incoming);
// The ray weight is simply multiplied by the magnitude of the reflected color
Ray ray3(hitPoint, mirrorDir);
Vec3f init_normal(0, 0, 0);
Hit hit3(distolight, NULL, init_normal);
//忘记乘以本身的反射光系数%…………
canswer += traceRay(ray3, tmin, bounces + 1, weight*rc.Length(), indexOfRefraction, hit3)*rc;
if (bounces + 1 < max_bounces)
RayTree::AddReflectedSegment(ray3, 0, hit3.getT());
}
//printf("当前已有光线:\n");
//RayTree::Print();
//从这里开始还都存在问题!!!!!
//折射光
Vec3f transmitted;
Vec3f tc = material->getTransparentColor();
float index = material->getIndexOfRefraction();
if (tc.r() > 0 && tc.g() > 0 && tc.b() > 0)
{
Vec3f init_normal(0, 0, 0);
Hit hit4(distolight, NULL, init_normal);
//在判断折射光的存在之后,要考虑光线的位置:物体内还是物体外
//这里根据normal和incoming的点积来判断
Vec3f incoming = ray.getDirection();
float judge = normal_dir.Dot3(incoming);
if (judge < 0)//光线在外
{
if (transmittedDirection(normal_dir, incoming, 1, index, transmitted))
{
Ray ray4(hitPoint, transmitted);
canswer += traceRay(ray4, tmin, bounces+1, weight*rc.Length(), index, hit4)*tc;
RayTree::AddTransmittedSegment(ray4, 0, hit4.getT());
}
}
else//光线在内
{
normal_dir.Negate();
if (transmittedDirection(normal_dir, incoming, index, 1, transmitted))
{
Ray ray4(hitPoint, transmitted);
canswer += traceRay(ray4, tmin, bounces+1, weight*rc.Length(), 1, hit4)*tc;
RayTree::AddTransmittedSegment(ray4, 0, hit4.getT());
}
}
}
//printf("当前已有光线:\n");
//RayTree::Print();
}
else
canswer = sceneParser->getBackgroundColor();
canswer.Clamp();
return canswer;
}