【发布时间】:2018-11-25 13:49:30
【问题描述】:
不幸的是,它根本没有帮助的答案,所以希望这会引发更好的讨论。使用 C++,手头的任务是编写经典的光线追踪器。我正在使用 Phong 着色模型,并且能够准确地照亮我的场景,直到我需要投射阴影光线。
仅供参考,这是我到目前为止没有尝试阴影的图片:
按照传统的光线追踪算法,我寻找离我的针孔相机最近的物体,我调用以下函数来计算生成的像素颜色:
glm::vec3 Scene::illuminate(Ray* primary, Surface* object, glm::vec3 hitPt)
{
float red, green, blue;
Material m = object->getMaterial();
float p = m.phongCoef;
glm::vec3 kD = m.diffuse;
glm::vec3 kS = m.specular;
glm::vec3 kA = m.ambient;
float iA = m.ambienceIntensity;
float i = lightSrc.lightIntensity;
glm::vec3 n = object->getSurfaceNormalAt(hitPt); //normalized before return.
glm::vec3 viewRay = primary->getDirection(); //normalized class member.
glm::vec3 lightRay = glm::normalize((lightSrc.getOrigin()) - hitPt); //origin not normalized before here
glm::vec3 h = glm::normalize(viewRay + lightRay);
float nDotlightRay = glm::dot(n,lightRay);
float nDoth = glm::dot(n, h);
bool inShadow = false;
Ray shadowRay;
//hitPt = glm::normalize(hitPt);
shadowRay.setOrigin(hitPt);
shadowRay.setDirectionVector(lightRay);
for (int k = 0; k < objects.size(); ++k) {
if (objects.at(k)->intersect(shadowRay)) {
//std::cout<<shadowRay.getDirection().x<<","<< shadowRay.getDirection().y <<","<<shadowRay.getDirection().z<<"\n";
inShadow = true;
break;}}
//plug in to shading model
if (inShadow)
{
red = kA.x*iA;
green = kA.y*iA ;
blue = kA.z*iA ;
}
else{
red = kA.x*iA + kD.x*i*(fmax(0,nDotlightRay)) + kS.x*i*(powf((fmax(0, nDoth)),p));
green = kA.y*iA + kD.y*i*(fmax(0,nDotlightRay)) + kS.y*i*(powf((fmax(0, nDoth)),p));
blue = kA.z*iA + kD.z*i*(fmax(0,nDotlightRay)) + kS.z*i*(powf((fmax(0, nDoth)),p));
}
glm::vec3 pixelColor = glm::vec3(red, green, blue);
return pixelColor;
}
我尝试使用描述性变量/函数名称,以尽量减少伴随我的代码的解释。 glm::vec3 只是 GLM 数学库中的一个数据结构,它包含一个 3D 向量,可以在其上进行矩阵/向量操作。
正如我在上面链接的问题中一样,这是尝试阴影后我的场景的样子。
此场景的光源位置为 (0, 2.5, -7.75),表示为相机参考系(原点为 (0,0,0) 并面向负 z 方向)。对于另一个场景,光源位于 (4, 6, -1),因此输出甚至与我尝试渲染的另一个场景的问题不一致,如您所见here;它只有一条穿过场景顶部的细灰线,其他任何地方都没有阴影?我完全迷失了,仅在这个问题上就花了大约 10 个小时;任何建议都会很棒。
如果还有其他我可以提供的信息,请告诉我,例如我如何计算距离和命中点??我不知道我是否应该研究这些,因为阴影部分工作得很好,或者你们认为它仍然会导致这个问题吗?深度等应该不是问题,因为物体在阴影之前看起来是正确的?
【问题讨论】:
标签: 3d raytracing phong