有什么毛病我软阴影的代码?
-
21-08-2019 - |
题
我试图写一个简单的光线跟踪作为一种业余爱好项目,这一切都做工精细现在,除了我不能得到软阴影在所有的工作。我软阴影的想法是,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个影子的光线中的一个,但在网格中的位置是随机的。 这里你可以找到它描述了如何可以使用教程的一部分用于软阴影。