C 阴影与阴影

C 阴影与阴影,c,algorithm,graphics,pseudocode,C,Algorithm,Graphics,Pseudocode,我在网上读过很多光线追踪算法。但是,我对阴影和阴影没有清晰的理解。根据我的理解,下面的伪代码正确吗 for each primitive check for intersection if there is one do color be half of the background color Ishadow = true break for each ambient light in environment

我在网上读过很多光线追踪算法。但是,我对阴影和阴影没有清晰的理解。根据我的理解,下面的伪代码正确吗

for each primitive 
    check for intersection
    if there is one 
         do color be half of the background color
         Ishadow = true
         break

for each ambient light in environment        
    calculate light contribution to the color

if ( Ishadow == false ) 
   for each point light 
     calculate diffuse shading
     calculate reflection direction
     calculate specular light


trace for reflection ray // (i)  
add color returned from i after multiplied by some coefficient

trace for refraction ray // (ii)
add color returned from ii after multiplied by some coefficient

return color value calculated until this point

应将阴影与正常光线跟踪路径集成:
对于每个屏幕像素,您通过场景发送光线,并最终确定最近的对象交点:在最近的对象交点处,您将首先读取该点处对象的像素颜色纹理,除了使用法线向量计算反射向量等,您现在还可以从该交点向场景中的每个光源投射光线:如果这些光线在击中光源之前与其他对象相交,则交点处于阴影中,您可以调整该点的最终颜色因此。

伪代码的问题在于,很容易获得足够的伪代码,使其成为我们试图通过避开自然语言来避免的同样的歧义。颜色是背景色的一半吗?这条线在您迭代光源之前出现的事实令人困惑。在迭代光源之前,如何设置Ishadow

也许更好的描述是:

given a ray in space
    find nearest object with which ray intersects
    for each point light
        if normal at surface of intersected object points toward light (use dot product for this)
            cast a ray into space from the surface toward the light
                if ray intersection is closer than light* light is shadowed at this point
*如果您在阴影中看到奇怪的工件,那么每个程序员在编写第一个光线跟踪器时都会犯一个错误。浮点或双精度数学是不精确的,在进行阴影跟踪时,通常会有一半的时间重新相交。没有图表的解释有点难以描述,但让我看看我能做些什么


如果在球体表面上有一个交点,在大多数情况下,该点在浮点寄存器中的表示在数学上并不精确。它要么稍微在球体内部,要么稍微在球体外部。如果它位于球体内部,并且您尝试对光源运行交点测试,则最近的交点将是球体本身。相交距离将非常小,因此您可以简单地拒绝任何接近0.000001个单位的阴影光线相交。如果您的几何体都是凸面的,并且无法对其自身进行合法的阴影处理,则在进行阴影测试时,您可以跳过对球体的测试。

如果光线原点和交点之间的距离小于到灯光的距离,则通常会这样做,若光线原点和交点之间的距离小于到灯光的距离,且距离大于.00001,那个么只需将其展开,即可对该点进行阴影处理。