我试图写一个简单的光线跟踪作为一种业余爱好项目,这一切都做工精细现在,除了我不能得到软阴影在所有的工作。我软阴影的想法是,lightsource被认为有一个位置和半径。做一个阴影测试在此光予取其中初级射线打在场景中的物体并朝向,其中每个新的射线具有随机分量到每一个轴,其中,所述随机分量改变lightsource投射的光线的正量的点-radius和半径之间。

如果这样的光线照射在所述场景中的对象,我递增隐私权|发布广告(如果一个光线照射多个对象,但它仍然只能与一个增量)。如果它使在不碰撞lightsource,我主射线的交点到lightsource的中心的距离增加的变量。

当已经采取n个样本,我计算发生了冲突,并通过该比率(乘以光的颜色的光线的比例,使与颜色1000,1000,1000光将成为500500500为0.5,其中比一半的光线已相撞)。然后,我通过将较早的距离可变非碰撞射线的量计算到lightsource的平均距离。我返回变量和函数退出。

的问题是:它不工作。不太至少。它看起来像什么可以看出这里。你可以看到它有点类似于软阴影,如果你眯着眼睛真正的努力。

我不明白这一点,我在做某种根本性的缺陷在这里,或者是一些微小的?我相当肯定的问题是这种方法,因为当我指望用这种方法直接产生部分点亮像素数,只有大约250,当应该有很多。而当你在照片仔细观察,你可以看到有一些部分像素发亮,这表明该代码的其余部分处理部分的亮像素就好了。

下面是用于软阴影类实际光:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyFirstRayTracer
{
  public class AreaLight : ILight
  {
    private const int _radius = 5;
    private const int _samples = 16;
    public Color Color { get; set; }
    public Vector Location { get; set; }
    #region ILight Members

    public float GetLightingInformation(Vector point, ISceneObject[] scene, out Color color)
    {
      int intersectCount = 0;
      float distance = -1;
      for(int i = 0; i < _samples; i++)
      {
    bool intersects = false;
    float rand = 0;
    rand = _radius - (float)(new Random().NextDouble()*(2*_radius));
    foreach (ISceneObject obj in scene)
    {
      Vector iPoint;

      Vector loc = new Vector(Location.X + rand, Location.Y + rand, Location.Z + rand);

      if (!obj.Intersect(new Ray(point, loc), out iPoint))
      {
        distance += (Location - point).SqLength;

      }
      else
      {
        intersects = true;
        distance -= (Location - point).SqLength;
      }
    }
    if (intersects)
      intersectCount++;
      }
      float factor = 1-((float)intersectCount/_samples);

      color = new Color(factor*Color.R, factor*Color.G, factor*Color.B);

      return (float)Math.Sqrt(distance / (_samples - intersectCount));
    }


    #endregion
  }
}
有帮助吗?

解决方案

尝试生成的“LOC”各成分不同的“兰特”。由于是,你的抖动点的所有位于一条线上。

其他提示

次要点但这是随机类的最佳使用..

 for(int i = 0; i < _samples; i++)
      {
        bool intersects = false;
        float rand = 0;
        rand = _radius - (float)(new Random().NextDouble()*(2*_radius));

如果不是这种..

    var rnd = new Random()    
    for(int i = 0; i < _samples; i++)
              {
                bool intersects = false;
                float rand = 0;
                rand = _radius - (float)(rnd.NextDouble()*(2*_radius));

您实际生成就行上的线与方向的点(1,1,1)。是真的lightsource线性?

另外,我可以勉强看到在你的榜样东西。你可以让你的相机更接近对阴影的情况下,而不是从光的方向指向?

看,这就是我为什么来到这个网站:)

每个轴现在都有自己的随机的,它看起来好了很多。它仍然是一个有点怪异,增加样本数量有助于虽然。现在看起来像

你知道一个更有效的方式,以减少形成图案的?

最大的帮助,但:没有实例随机对每个样品。它严重三倍,我的渲染速度与柔和的阴影!我从来不知道随机如此昂贵的实例。哇。

非常感谢。

在你的回应,你问的改进方法,使软阴影。的改善可能是,而不是从同一个点随机化所有的光线,给每条射线不同的所有轴偏移,有效地给他们一个独立的小窗户上,在随机化,这将导致更均匀的分布。我不知道这是否是明确的,但另一种方式来描述它是作为一个网格,其垂直于阴影射线。网格中的每个瓦片包含n个影子的光线中的一个,但在网格中的位置是随机的。 这里你可以找到它描述了如何可以使用教程的一部分用于软阴影。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top