【问题标题】:Efficient way to light up/cast shadows on a voxel terrain在体素地形上点亮/投射阴影的有效方法
【发布时间】:2014-03-04 03:36:32
【问题描述】:

我正在使用 BufferGeometry 和一些预定义的数据来创建一个类似于 Minecraft 块的对象(由体素组成并包含类似洞穴的结构)。我无法有效地点亮此对象。

目前我正在使用MeshLambertMaterialDirectionalLight,这使我能够在没有光线的情况下在体素上投射阴影,但是这对于大地形使用效率不高,因为它需要非常大的阴影贴图,因此通常会导致出现故障的阴影伪影。

这是我用来将索引和顶点添加到 BufferGeometry 的代码:

// Add indices to BufferGeometry
for ( var i = 0; i < section.indices.length; i ++ ) {
    var j = i * 3;
    var q = section.indices[i];

    indices[ j ]     = q[0] % chunkSize;
    indices[ j + 1 ] = q[1] % chunkSize;
    indices[ j + 2 ] = q[2] % chunkSize;
}

// Add vertices to BufferGeometry
for ( var i = 0; i < section.vertices.length; i ++ ) {
    var q = section.vertices[i];

    // There's 1 color for every 4 vertices (square)
    var hexColor = section.colors[i / 4];

    addVertex( i, q[0], q[1], q[2], hexColor );
}

还有我的“块”示例: http://jsfiddle.net/9sSyz/4/

截图:

如果我要从示例中移除阴影,则正确一侧的所有体素都会被点亮,即使另一个体素挡住了光线。我只需要另一种可扩展的方式来产生阴影的错觉。如果不考虑光线,也许通过改变顶点颜色?它不必像当前的阴影实现那样准确,因此更改顶点颜色(以提供块状顶点绑定阴影)就足够了。

不胜感激任何帮助或建议。谢谢。

【问题讨论】:

  • (1) 相机位置有灯光。抵消它。 jsfiddle.net/9sSyz/1 (2) 我建议进行环境光遮蔽后处理,不要使用阴影贴图。你目前不喜欢的究竟是什么——视觉上,就是?
  • 谢谢。我将对环境光遮挡进行一些研究。并不是我不喜欢它的样子。由于所需阴影贴图的大小,只是在多个这些“块”上使用相同的方法出现性能问题,所以我想问是否有更好的(甚至在视觉上更不令人印象深刻)的方法来使洞穴等变暗。 :)
  • (1) 看看jsfiddle.net/9sSyz/5。我移除了阴影贴图并添加了环境光遮蔽。用 t 键切换 ao。 (2) 另外,作为一个实验,我用基本材料代替了兰伯特。 jsfiddle.net/9sSyz/6。 ao 效果令人难以置信。
  • 非常感谢!我一直在试验您的基本材质示例,并且添加了 FXAA(禁用内置),它看起来非常棒! jsfiddle.net/9sSyz/7 我想我会保持这种状态并找到另一种添加阴影的方法。我不认为像这样基本的东西需要使用带有动态阴影的 MeshLambertMaterial。再次感谢! :)
  • 嗯,就个人而言,我更喜欢 no-shadows + MeshLambert + ao 而不是 MeshBasic + ao。但每一个他自己。 :-)

标签: javascript three.js webgl shadow light


【解决方案1】:

一般来说,如果你有大地形,想法是将场景分割成更多级联,每个级联都有自己的阴影贴图。技术称为CSM - 级联阴影贴图。问题是,我还没有听说过实现这种技术的 webGL 示例。 CSM 用于动态场景。但我不确定用 Three.js 实现这一点有多容易。

第二个选项是添加环境光遮蔽,正如 WestLagnley 所建议的那样,但这只是一种遮蔽,而不是阴影。结果大相径庭。

第三种选择,如果您的场景大部分是静态的 - 烘焙阴影。因此,您只需将预处理纹理应用于地形等。为了支持动态对象,只需渲染它们的阴影贴图并将其应用于一些仅模仿阴影区域的几何体(也许,一个稍微悬停在地面上方并接收阴影等的平面) .

上述技术的任意组合也是一种选择。

附:您能否也提供一个屏幕截图,小提琴无法加载。

【讨论】:

  • three.js 支持级联阴影贴图,可以在此处找到示例:threejs.org/examples/webgl_morphtargets_md2_control.html。三.js.r.65
  • 感谢抽象算法! @WestLangley 您是否知道为什么级联阴影不适用于我的 BufferGeometry?获取着色器 var 'MAX_SHADOWS' 的错误“数组大小必须是正整数”,但不将 BufferGeometry 添加到场景中会消除这些错误。 jsfiddle.net/9sSyz/3
  • 也是抽象算法,这是小提琴的截图:puu.sh/6NbeC.png 视觉上没有问题,只是想要一种使阴影更有效的方法。 :)
  • 需要更高效的影子 - CSM 是要走的路。请接受答案,如果您还有其他问题,请在论坛上提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2015-11-30
相关资源
最近更新 更多