【发布时间】:2014-02-15 12:41:48
【问题描述】:
我有一个网格,我正在从 3d studio max 加载到 three.js。我修改了three.js 来保存另一个类型化数组来存储副法线数据。在涉及到阴影之前,这一切似乎都工作得很好。出于某种原因,阴影贴图是错误的,看起来好像它在渲染网格时面翻转了。
在这个例子中,阴影在地板上正确显示,因为渲染器有
.shadowMapCullFace = THREE.CullFaceBack
http://dusanbosnjak.com/test/webGL/new/StojadinCeo/stojadinCeo.html
我可以让其他阴影显示在我的着色器上,但自阴影会导致可怕的伪影,而且我的网格投射到其他网格上的阴影总是反转。
我尝试颠倒面部不确定的出现顺序(acb 而不是 abc),这会翻转面部。这会创建适当的阴影投射,但网格显示翻转。
我现在想做的是导出一个翻转的网格,并在 shaderMaterial 中反转剔除顺序,但是找出为什么会发生这种情况会很棒。
我基本上将 phong 和阴影贴图着色器块与我所拥有的东西联系起来。
编辑
这是一个更新的场景,其中包含一些阴影投射器并在导入的网格上接收阴影
http://dusanbosnjak.com/test/webGL/new/StojadinCeo/stojadinCeo2.html
light = new THREE.SpotLight(0xaaaaaa);
light.position.set(10,10,10);
light.shadowCameraVisible = true;
light.shadowDarkness = .5;
light.castShadow = true;
light.shadowCameraNear = 1;
light.shadowCameraFar = 250;
light.shadowCameraFov = 57;
light.shadowMapWidth = 2048;
light.shadowMapHeight = 2048;
scene.add(light);
其余的网格只是将 receiveShadow 和 castShadow 设置为 true
阴影显示在 shaderMaterial 上(我复制了 shadowfrag 块) THREE.Mesh() 和 THREE.CubeGeometry() 都可以正确投射和接收阴影,但是 shaderMaterial 网格投射的阴影是反转的。
我无法真正将其隔离为 50 行代码,因为它是一个完整的导入/导出过程。
我不明白为什么阴影相机会倒置渲染这个特定的网格,而普通相机会正确渲染它,如果发生了这种情况?
您可以使用 wasd 缩小和移动汽车
【问题讨论】:
-
(1) 您的问题是什么? (2) 你能提供一个简单的 50 行程序来演示这个问题吗? (3) 你能在一个简单的单组件模型上演示这个问题吗?
-
(1)我可以做些什么来使这个网格在阴影投影中显示为倒置?(2) 我更新了示例来演示问题(默认情况下是剔除)但我无法演示它是一个更简单的案例,因为它是我正在处理的进口商/出口商的一部分。有没有什么地方可以根据更新的示例指出我,也许我可以将代码隔离为有意义的东西?
-
对不起,我已经尝试过,但我不知道您的问题是什么,也不知道问题是什么,也不知道您所说的“倒置阴影投影”是什么意思。
-
如果您看一下车轮(您可以驾驶汽车四处行驶),您会发现阴影投射不正确。就好像影子相机看到翻转的脸。屋顶并没有在地板上投下阴影,而轮子却从里向外投射。
-
好的。现在我明白你的问题了……除非你改变了默认设置,否则只有背面会投射阴影。每个网格都需要有厚度。避开飞机,比如车顶。解决方法:
renderer.shadowMapCullFace = THREE.CullFaceBack;或THREE.CullFaceNone。
标签: three.js