3D影子实施理念

hus*_*sik 11 java 3d java-3d shadow

假设您的眼睛位于物体A上的表面点P1并且存在目标物体B并且物体B后面存在点光源.

问题:如果我看到光源并说"我在阴影中",如果由于物体B我看不到光线,我是对的吗?然后我将对象A的那个点标记为"A上的B的阴影点之一".

在此输入图像描述

如果这是真的,那么我们可以在A的表面上建立一个"阴影几何"(黑色)对象,然后由于光,B,A等的运动实时地改变它吗?让我们说球体(A)有1000个顶点而其他球体(B)也有1000个顶点,那么这意味着1个百万的比较吗?(是阴影,O(N ^ 2)(时间)复杂性?).我不确定复杂性,因为改变P1(眼睛)也会改变B的观察点(P1和光源点之间).那么二阶阴影和更高的阴影(例如两次物体之间多次反射的光线)?

我现在使用的是java-3D,但它没有阴影功能,所以我想转移到其他兼容java的库.

谢谢.

编辑:我需要在移动相机时禁用"相机"来构建阴影.我怎样才能做到这一点?这会严重降低性能吗?

新思路: java3D具有内置的碰撞检测功能.我将创建从光到目标多边形顶点的线(不可见),然后检查来自另一个对象的碰撞.如果发生冲突,请添加该顶点corrd.到阴影列表,但这只适用于点光源:(.

任何为java3d提供真正的阴影库的人都会非常有帮助.

java3D中非常小的样本Geomlib阴影/光线跟踪可能是最好的 Ray跟踪示例吗?

我知道这有点难,但至少有一百人可以试过.

谢谢.

Kos*_*Kos 2

您的方法可以总结如下:

foreach (point p to be shaded) {
    foreach (light) {
        if (light is visible from p)
            // p is lit by that light
        else
            // p is in shadow
    }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,这就是当今 GPU 上实时阴影的实现方式

然而,要使其高效工作并非易事。渲染场景是一个逐个三角形的简化过程。如果对于每个三角形中的每个点(像素、片段),您需要考虑其他三角形中的所有其他三角形来检查光线相交,那将非常麻烦。

那么如何高效地做到这一点呢?答案:相反的过程。

通常,场景中的灯光比像素少得多。让我们利用这一事实并进行一些预处理:

// preprocess
foreach (light) {
    // find all pixels p on the scene reachable from the light
}
// then render the whole scene...
foreach (point p to be shaded) {
    foreach (light) {
        // simply look up into what was calculated before...
        if (p is visible by the light)
            // p is lit
        else
            // p is in shadow
    }
 }
Run Code Online (Sandbox Code Playgroud)

这看起来快了很多......但仍然存在两个问题:

  1. 如何找到光线可见的所有像素?
  2. 如何在渲染过程中快速访问它们以进行查找?

这是棘手的部分:

  • 为了找到灯光可见的所有点,请将相机放置在那里并渲染整个场景!深度测试将拒绝不可见的点。
  • 为了稍后可以访问此结果,请将其保存为纹理并在实际渲染阶段使用该纹理进行查找。

这种技术称为“阴影贴图”,具有从光源可见的像素的纹理称为“阴影贴图”。有关更详细的解释,请参阅Wikipedia 文章等。