【问题标题】:THREE.ShaderMaterial is seen inverted by the shadow Camera三、ShaderMaterial 被阴影相机看到倒置
【发布时间】: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


【解决方案1】:

除非您更改了 three.js 中的默认设置,否则只有背面会投射阴影。解决方法是设置:

renderer.shadowMapCullFace = THREE.CullFaceBack;

renderer.shadowMapCullFace = THREE.CullFaceNone;

但这些选项可能会导致其他问题。

最好的方法是确保每个网格都有深度。避开飞机,比如车顶。 例如,您可以在车顶上添加内部衬里以增加深度。

WebGL 中的阴影映射可能很棘手,因此请阅读所有有关它的内容,以便熟悉所涉及的问题。

three.js r.66

【讨论】:

  • 从 r85 开始,似乎首选语法是 renderer.shadowMap.renderReverseSided = false;
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多