C++ 光线跟踪阴影虫

C++ 光线跟踪阴影虫,c++,graphics,raytracing,C++,Graphics,Raytracing,我正在尝试渲染一个与左侧相似的图像,但阴影+反射有问题 现在,只有影子代码可以显示问题 正如你所看到的,红色的球应该在绿色的球附近被阴影遮挡,但是由于一些奇怪的原因,像素都被弄乱了。当我关闭代码的阴影部分时,它会正常渲染没有阴影的红色球 我认为这个问题的根源也影响着反思。希望你们能给我一些建议;我看不见了。鉴于你的左图显示的是癌症,这是一个典型的阴影光线击中被反射物体的例子。命中测试阴影光线时,需要排除生成光线的曲面。只需将源对象传递到shadow函数中,并忽略它 此方法仅适用于凸面形状。如果你

我正在尝试渲染一个与左侧相似的图像,但阴影+反射有问题

现在,只有影子代码可以显示问题

正如你所看到的,红色的球应该在绿色的球附近被阴影遮挡,但是由于一些奇怪的原因,像素都被弄乱了。当我关闭代码的阴影部分时,它会正常渲染没有阴影的红色球


我认为这个问题的根源也影响着反思。希望你们能给我一些建议;我看不见了。

鉴于你的左图显示的是癌症,这是一个典型的阴影光线击中被反射物体的例子。命中测试阴影光线时,需要排除生成光线的曲面。只需将源对象传递到shadow函数中,并忽略它

此方法仅适用于凸面形状。如果你的形状是自阴影的(例如,一个圆环),你需要更一般。通常的方法是定义一个epsilon(浮点误差容限),并忽略任何比它更接近的交点


另一种方法是检测您击中曲面的哪一侧。您不应在球体上自阴影,因为光线投射方向与曲面法线方向相同(即传出光线与曲面法线的点积为正)-这不应算作阴影。

如果您的左图像显示癌症,这是一个典型的例子,阴影光线击中了被反射的物体。命中测试阴影光线时,需要排除生成光线的曲面。只需将源对象传递到shadow函数中,并忽略它

此方法仅适用于凸面形状。如果你的形状是自阴影的(例如,一个圆环),你需要更一般。通常的方法是定义一个epsilon(浮点误差容限),并忽略任何比它更接近的交点

另一种方法是检测您击中曲面的哪一侧。您不应在球体上自阴影,因为光线投射方向与曲面法线方向相同(即传出光线与曲面法线的点积为正)-这不应算作阴影。

已解决: 有一个算法问题不容易解释

另一种方法是:基本上,我检查余弦角是否大于0.0001,如果大于0.0001,则我不会对其进行阴影处理 有一个算法问题不容易解释


另一种方法是:基本上,我会检查余弦角是否大于0.0001,如果大于0.0001,我不会对其进行阴影处理

通常,你应该直接在帖子中包含代码(如果可能的话,将其缩减为较小的值),而不是链接到外部站点。确保你不是真正的自我阴影。我以前也写过类似的东西,光线与它离开的曲面相交,我通过沿传出光线的方向(远离曲面)稍微移动交点来修复它。无法将代码发布到内部,因此我将其链接出来:/How“little”?我尝试了一点,结果要么根本没有阴影,要么就是相同。你通常应该在你的帖子中直接包含你的代码(如果可能的话,将代码缩减为更小的代码),而不是链接到外部站点。确保你不是真正的自阴影。我以前也写过类似的东西,光线与它离开的曲面相交,我通过沿传出光线的方向(远离曲面)稍微移动交点来修复它。无法将代码发布到内部,因此我将其链接出来:/How“little”?我试了一点,结果要么根本没有阴影,要么就是一样