【发布时间】:2014-03-04 03:36:32
【问题描述】:
我正在使用 BufferGeometry 和一些预定义的数据来创建一个类似于 Minecraft 块的对象(由体素组成并包含类似洞穴的结构)。我无法有效地点亮此对象。
目前我正在使用MeshLambertMaterial 和DirectionalLight,这使我能够在没有光线的情况下在体素上投射阴影,但是这对于大地形使用效率不高,因为它需要非常大的阴影贴图,因此通常会导致出现故障的阴影伪影。
这是我用来将索引和顶点添加到 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