Three.js: 选择性照明

创建于 2014-08-10  ·  101评论  ·  资料来源: mrdoob/three.js

我不确定这是否已经是计划中的功能,甚至可能是已完成的功能,因此我将尝试首先解释该任务。

我需要为不同的房间做选择性照明。 例如,我有两个房间。 一盏灯只能影响一个房间的物体和内墙。 第二个房间一定不能受到这盏灯的影响。

目前,如果我向场景中添加一盏灯,它会影响其距离内的所有对象。 当光线“穿过”第二个房间的墙壁时,我得到了奇怪的效果。

所以我想我需要某种组或通道来照明,以便我可以设置受一个光​​源影响的对象和受另一个光源影响的对象。

我在灯光或物体中都没有发现类似的东西,所以我认为这可能是一个很好的功能。

而且,顺便说一句,如果它还没有实现,使用three.js的当前状态解决此类任务的推荐方法是什么?

Enhancement

最有用的评论

你有这样的例子的链接吗?

在这里,我为你做了一个: https :

所有101条评论

我的意思是基本上有channel现场THREE.LightlightChannel现场THREE.Mesh或类似的东西。 如果后者为空,则它会受到所有光源的影响。 如果后者不为空,则它仅影响具有相同值的光通道。

或者它可以不添加到网格本身,而是添加到网格几何体的分离面。

听起来您想使用阴影?

嗯,我可以用阴影来实现类似的效果(我已经尝试过),但它会产生不同的副作用,我觉得这是一个黑客,因为我不需要照亮一些物体然后在它们上投射阴影. 我不能一开始就点燃它们。

我需要的是特定的光源不会影响一组网格,但会影响另一组网格。

通常我使用这样的技术来做到这一点:示例讨论线程

glEnable(GL_LIGHT0);
//...
glEnable(GL_LIGHTn);

// Draw the walls to room 1
DrawWalls(room[0]);

// Draw the contents of room 1
DrawContents(room[0]);

glDisable(GL_LIGHT0);
//...
glDisable(GL_LIGHTn);

// Draw the walls to room 2
DrawWalls(room[1]);

// Draw the contents of room 2
DrawContents(room[1]);

所以它看起来像一个与阴影不同的功能。 或者我错过了什么?

是的...我认为这确实可以派上用场。 不确定它的 API 应该是什么样子。

也许最简单的解决方案在这里可能是最有效的:

  1. channel (或group )添加到THREE.Light
  2. affectedByLightChannel (或affectedByLightGroup )添加到THREE.Mesh (甚至可能添加到几何图形中的一个面)

你怎么认为?

也许'affectedByLightChannel'太长了,像'lightChannel'这样的东西就可以了,但我认为它会很方便:只是光源和接收器上的通道号。

像那样:

    light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
    light.channel = 123
    testScene.add(light)

    testScene = new THREE.Scene
    geometry = new THREE.BoxGeometry(2,2,2)
    material = new THREE.MeshLambertMaterial 
        color: 0xffffff

    cube = new THREE.Mesh(geometry, material)
    cube.lightChannel = 123
    testScene.add(cube)

如果lightChannel等于 0,那么它会受到所有通道的影响。 如果channel等于 0,则它会影响所有网格。

因此,它将与当前行为完全向后兼容。

这可能有点难以理解......也许像这样更好:

cube.lightInfluences = [ light1, light2 ];

对我来说似乎完全没问题。

也许在某些情况下它更难使用,但显然更容易理解。

网格和灯光的简单整数掩码属性怎么样?

light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
light.mask = 0xffffffff; // default mask
testScene.add(light);

cube = new THREE.Mesh(geometry, material)
cube.mask = 0xffffffff; // default
testScene.add(cube);

如果对象的掩码的逻辑 AND 非零,则对象仅被灯光照亮。
这将允许灯光受到多个通道的影响,而无需在对象上使用额外的方法。

掩码默认值 0xffffffff 不会影响现有代码。

@satori99所说的。

虽然,我认为mask应该是LightMesh*Material的属性。 (仅那些受灯光影响的材料。)

此外,该属性也可以命名为lightMasklightChannelchannel

通道/掩码方法的问题是用户需要了解按位运算。 如果将其与 API 的其余部分进行比较,则有点过于激烈。

你可以用掩码做什么而不能用数组方法做些什么?

我可以举一个上面有两个房间的任务的例子。

使用通道方法而不是阵列方法的要点是,如果使用阵列,像“将 light1 从房间 1 移动到房间 2”这样的简单操作会变得更加复杂。

而不是仅仅设置

light1.channel = 2

(以前设置为 1)

您必须找到之前在 lightInfluences 阵列中具有 light1 的房间 1 中的所有对象,然后从其阵列中移除光,然后将其添加到房间 2 中的所有对象。

同样的故事与简单的操作,如“将对象 1 从房间 1 移动到房间 2”。 您不需要将它的影响通道从 1 设置为 2,而是需要找到该房间中的所有灯光,然后将它们从影响数组中移除,然后找到第二个房间中的所有灯光并添加它们。

不是做不到,这就是为什么我说lightInfluences方法对我来说绝对没问题。 但是通道的东西将是我在它上面为自己实现的第一件事,只是为了使常见的操作像 1 个分配一样简单。

我认为它应该作为一个面具来实现。 (是在 CPU 还是 GPU 上实现是后面讨论的问题。)

我们可以通过示例展示如何设置它,用户可以按照模式进行设置。

如果你觉得还是太复杂,那么我们可以为它创建一个THREE.Channels API。

light.channels = new THREE.Channels();
...
light.channels.clear();
light.channels.add( channel );
light.channels.remove( channel );
light.channels.all();

Mesh*Material相同方法。

我喜欢那个 API :)
我可以看到这适用于物体和灯光,但您如何看待它适用于材料?

只有材料对灯光有反应。 我认为这必须是材料的属性。

我同意@westlangley 的观点。 灯光取决于材料。

同样的故事与简单的操作,如“将对象 1 从房间 1 移动到房间 2”。

嗯,这是个问题。 Channels不会是基于对象的。

嗯,这是个问题。 通道不是基于对象的。

但为什么? 是技术限制吗?

因为它使所有这一切的整个想法都无效。 因为可以有不同的对象,它们重复使用相同的材​​料,但其中一个应该被点亮,而另一个 - 不应该被点亮。

但为什么? 是技术限制吗?

不,这是因为物体对光没有反应。 只有材料可以。

因为可以有不同的对象,它们重复使用相同的材​​料,但其中一个应该被点亮,而另一个 - 不应该被点亮。

您可以为场景中的所有对象使用相同的材​​质——只需clone用于材质需要不同统一值的对象的材质。 仍然应该只有一个着色器程序被所有人共享。

我认为它应该作为一个面具来实现。 (是在 CPU 还是 GPU 上实现是后面讨论的问题。)

这可以直接在 GPU 中轻松处理吗?

这可以直接在 GPU 中轻松处理吗?

是的,您需要为灯光和材料传递额外的channels制服。

层管理系统怎么样? 我会将网格分组并从那里应用蒙版(可能会影响灯光、阴影、可见性等),unity 是一个很好的例子吗?

阴影也是一个相关的话题。 我认为也应该有选择性阴影投射之类的东西。 像'receiveShadowFrom = ...'(和来源列表)而不是'receiveShadow = true'。

因为当您设置仅影响特定房间的灯光时(在我的示例中),您还会立即希望这些灯光仅在该房间对象上投射阴影。

出于与本线程中上述相同的原因,阴影属性应该真正位于材质而不是对象上。

出于与本线程中上述相同的原因,阴影属性应该真正位于材质而不是对象上。

是的,有道理!

是否有包含此功能的计划(例如第一稿的计划目标版本)?

作为一种变通方法,您能否通过为每个房间(及其灯光)设置单独的场景来满足大部分要求?

renderer.autoClear = false;
...
renderer.render( scene1, camera );
renderer.render( scene2, camera );

嗯,我会试试这个方法!

选择性照明/阴影是 IMO 未来版本的必要条件。

BIG +9999 对于这个,我很想能够选择一种材质是从光源 A 还是从光源 B 投射阴影。除了两个场景之外,目前有人有解决方案吗? 这会让事情对我来说非常痛苦......

天哪,这还没有实施吗? 来自 rohan 的 +9999 之后)

哈哈,我的猜测是实现@tsone有点困难,您能提供一些有关该提交的信息吗? 现在在手机客户端上浏览

如果这些只是传递给材料的制服,那么实施起来有多困难。 他们所要做的就是 substitude 全局灯光列表,其中定义在材质中的灯光(如果存在)位于 webgl 渲染器深处的某个位置。

这是一个简单的 JSFiddle,用于测试 Dev 分支的 Layers 实现:
https://jsfiddle.net/Angrypickle/t8f7q3vo/4/
不幸的是,截至目前,它看起来似乎不能正常工作。 还是我做错了什么?

是的。 图层还不适用于灯光。 不过,它们确实适用于相机/物体! 😊

罗杰先生! 这是一个更新的 JSFiddle,它使用重叠的相机来实现图层的选择性照明:
https://jsfiddle.net/Angrypickle/t4a1eusL/
它似乎在台式机和移动设备上都能正常工作。 任何人都看到这种方法非常糟糕? 至少在灯光被绑定到图层功能之前?

任何人都看到这种方法非常糟糕?

当然是坏的。 与其让单个摄像头在场景中导航,人们现在必须做一些事情camera1.add( camera2 );我的意思是当我看到它时这是 WTF。 像什么? 我的相机里的相机? 如果我有几十个房间需要单独照明怎么办? 我需要多少个摄像头? 还有层……昨天没有层对吧,现在我要l̲e̲a̲r̲n̲关于它们。

咆哮,并不是说我有完美的解决方案。 例如,alternativa3d 人们过去常常将灯光放在灯光边界框内的东西上。 这对于最终用户来说具有 next-to-0 设置的优势,但是当灯光之间的边界必须成一定角度时,它就会崩溃。 但是,如果我现在必须在实际项目中解决这个问题,我很可能会决定将使用过的标准材质刮到 ShaderMaterial-s 中,然后将我想要的灯光手动传递到那里。

@makc层实际上超级简单(而且功能强大)!
@Zob1的方法绝对不是正确的方法。 希望用不了多久,图层也可以与灯光一起使用。

伙计们只是为了确保我正确地跟随; 假设我有一个场景和一个“主”光源。 使用这种技术是否有可能让某些材料忽略这个主光源,同时也从不同的光源投射阴影?

好吧,为此我们还必须为材料添加层支持。

我们目前可以做的是显示/隐藏相机中的对象:

假设您正在做一个游戏,并且在编辑器中使用球体来显示对撞机。 这些球体可以设置为第 1 层,相机的编辑器可以启用第 0 层和第 1 层,但游戏相机可以设置为第 0 层。这样,在您的编辑器中,您可以看到所有假人,但在游戏中它们”重新走了。

我认为每当我将功能添加到编辑器本身时,这会更有意义。 我们或许也应该做一些例子。

对! 所以基本上我想做的是,我的三个 JS 世界中有 2D 角色。 这些角色需要“点”阴影,使他们看起来像是环境的一部分。 我目前正在使用放置在他们脚下的透明黑色圆形几何图形和一些相当笨拙的东西来实现这一点,以使其在一定角度工作。 即便如此,它在复杂的表面上也根本无法正常工作。

我最初的想法是在每个角色上方放置不可见的圆形几何图形作为“光晕”,并创建一个直接指向下方的灯光,覆盖整个场景。 这些光晕只会从这个光源投射阴影,而场景中的所有其他东西都会从“主”光源投射阴影。

我想要让这个想法奏效,我们需要层,对吗?

这些光晕只会从这个光源投射阴影,而场景中的所有其他东西都会从“主”光源投射阴影。

我们曾经有一个shadowOnly选项,但它已被删除。

FWIW,有这种创建阴影的方法......

啊,但 shadowOnly 不会真正起作用,因为光晕会从两个光源投射阴影,我只希望它们从一个光源投射阴影。

我现在会在电话上查看该示例,但看起来很有希望。

编辑嗯,但是如果该球体改变了它在场景中的位置并且地面网格具有不同的高度,它的阴影是否会正确匹配地面的表面法线?

不...

是的,是这么想的。 需要层次! 呵呵

嗨@rohan-deshpande,

是的,对于您的用例,您将需要某种层。 我是不久前实现 shadowmesh 功能的人。 它们旨在用于包含平坦地板或地面的场景,因为它们是单平面阴影。 但是,如果您需要快速、廉价(但正确)的单平面阴影,这些在性能方面很难被击败。 我添加这些的原因是因为即使对于简单的演示场景,阴影贴图也会大大降低我的帧率。 另一方面,即使在我的手机上,Shadowmeshes 也运行得很快。

你可以在这里查看我使用它们的游戏:
https://github.com/erichlof/3dLightCycles

我通过 2 个不同的视口对场景进行了两次渲染,并且所有游戏对象(循环和路径墙)都有正确的阴影。 它在我的智能手机上运行如丝般流畅,这对于每帧 2 个场景渲染的阴影贴图是不可能的。

+1 此处用于将来的图层:)

@erichlof游戏在 iPhone6 man 上看起来和运行都很棒。

好吧,我想我会等待层。 在那之前,我的hacky解决方案就足够了。

不,它还没有实施。 您将不得不等待图层或尝试 ITT 中列出的解决方案之一(例如单独的场景)。

再次 +99999

这肯定会非常有帮助。 我们现在有层在工作,这听起来像是阻碍了这一点。 所以,这是友好的碰撞。 ;-)

@manthrax检查这个!

再次 +99999

我很乐意这样做。 我有一种情况,每个化身只被最近的灯照亮,我可以在场景中放置数千个灯,为每个化身指定一个灯会很好。

你好!
我将需要这个功能,我想实现它,因为我认为我已经找到了可以完成的地方( initMaterial in WebGLRenderer )并且使用它应该非常简单现有图层。

我正在考虑创建一个特定于灯光的位掩码(作为Layers对象)来选择哪些图层受特定灯光对象(独立于灯光自己的对象层)的影响,然后过滤灯光/阴影贴图被设置为上述函数中每个对象的制服。

那会相关吗?

除非您在此之前将我重定向到其他方法,否则我将尝试此操作并在我完成此操作后立即提交拉取请求。

更新:

https://github.com/tiesselune/three.js/tree/selective-lighting

我要到达某个地方了。 不确定这会如何影响性能或如何优化我的性能代码,但它正在处理我所做的少数测试。 每层照明! 耶!

不过,我仍然需要进行更多测试,并在提交拉取请求之前制作一个相关示例。

更新:

我做了一些更多的测试,并且在不同层(并且具有不同的照明设置)的两个对象上使用相同的材​​质会导致渲染器不断更新材质(通过needsUpdate ),因为照明设置关于两个物体之间的材料变化,这在以前是不可能的。 这意味着巨大的性能下降和视觉上的奇怪(因为上次上传的材料在渲染时获胜)

当然,这可以通过创建一个新的材质实例来避免,而不是为具有不同照明设置的两个对象使用完全相同的实例。 但我怀疑为用户克隆它是一个好主意,因为这意味着观察原始材料的变化以将它们镜像到克隆上。

这是我可以使用的两种解决方案:

  1. 当具有不同照明设置的不同层上的两个对象共享相同的材质时,我可以只显示警告,因此用户可以自己创建和管理新的克隆材质。

  2. 我可以在材质级别而不是对象级别添加图层(并为灯光创建平行图层系统),以便强制使用不同的材质来实现不同的照明设置。 这意味着将有当前的可见性层系统(在对象和相机上)和不同的照明层系统(在材料和灯光上)。

你们有什么感想?

当我看到你的评论时,我只是在想这个。我认为显示警告没有帮助,因为很多人可能不会看到它。 在这两者中,我绝对更喜欢在材质上而不是在物体上设置光层。 这有点违反直觉,但仍然有道理。

澄清一下,当设置needsUpdate ,在这种情况下,它只是重新计算统一值,对吗? 它不应该重新编译着色器,因为不同的着色器都应该被缓存。 你看到什么样的性能冲击? 您是否使用分析器来准确查看额外计算发生的位置?

顺便说一句, filterAmbiantLights应该是filterAmbientLights

你是正确的拼写错误。 实际上,在注意到它是错误的并且我忘记了发生之前,我已经用“ambiant”写了所有内容。 😇

我想我会在材料上移动图层信息。 它似乎更相关,更符合它的工作方式。

性能下降来自(并且仍然来自) initMaterial (然后acquireProgramgetShaderParameter由于某种原因非常慢)每帧被调用多次,因为lightHash每次都会不同,将material.needsUpdatetrue

顺便说一句,我正在使用 Chrome 的分析工具。 (时间线和分析器)。

这对我来说很好,但我不清楚为什么acquireProgram应该一直运行。 如果将每种类型的光的数量添加到程序参数中,那么每次都不需要重新编译着色器吗?

我也不明白;

这是调用堆栈(在每一帧)和随后的可怕内存泄漏,如果您熟悉这些,这可以帮助我理解出了什么问题。 看起来它每帧都在创建新的WebGLProgram ......

threejscalltree

也许它可能是replaceLightNums在 WebGLProgram 创建期间更新顶点/片段着色器代码,导致它重新编译,或者考虑它是一个不同的着色器......?

编辑:无论如何,在材料级别使用图层可以按预期解决问题。 我只是在某处发生了内存泄漏,我应该调查一下,但除此之外看起来还不错。

理解为什么会发生这种情况可能是一个好主意,以确保您完全理解代码并且不会引入一些新错误。 你能逐步了解为什么着色器代码每帧都会改变吗?

我不太了解WebGLPrograms来说明发生了什么,但它似乎应该为您缓存这些着色器。

其实很简单:

  • 要知道是否调用acquirePrograminitMaterial从缓存中获取着色器“代码”(它更像是一个散列,实际上,在getProgramCode构建)并进行比较将其添加到当前材料程序的“代码”中。
  • 由于此函数根据包括每种类型光的数量在内的参数创建“代码”,这些参数经过过滤,并且对象之间虽然不同,但对于相同的材料(可以说,相同的程序),从对象到对象的代码可能不同。其他。
  • 由于对每个对象重复此过程,因此“代码”每帧更改多次,导致它在单个帧中重新编译多次:这会导致性能下降。
  • 也就是说,由于几个对象具有相同的材质,因此,相同的程序,最后一个对象迭代通过将其参数强加给程序,这导致两个对象使用相同的灯光设置但不一定相同的阴影贴图(即可以以不同的顺序为对象计算,但遇到相同的“最后一个对象获胜”问题),导致我的视​​觉异常。

现在一切都按预期工作(因为具有不同灯光设置的每个对象都有不同的材质和不同的程序),除了内存优化我可以用我自己的灯光散列进行,我很快就会解决这个问题。

如果灯光数字是可变的,那么可能会有一些改进,因此每种材质都只是同一程序的实例,但是由于这些数字被插入到着色器代码中(在replaceLightNums ),它似乎与当前的方式不兼容是(及其优化)。

希望解释足够好理解

我想知道我们是否可以将图层蒙版传递给着色器(每个对象一个统一,每个灯光一个更统一)。 然后,我们可以添加像这样这里

就像是...

for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {

    pointLight = pointLights[ i ];
    pointLight.distance *= float( object.mask & pointlight.mask > 0.0 );

    ...

}

嗯,我不认为我们可以在 glsl 中进行按位运算......

是的,看起来按位运算从 GLSL 1.30 开始,而标准 WebGL 使用 1.00。 😕

@mrdoob@tiesselune

Chrome 56 和 Firefox 51 刚刚登陆,这意味着默认启用 WebGL 2.0(WebGL2 遵循 OpenGL ES 3.0 规范)。 这意味着现在可以使用位操作(以及其他很酷的东西,如 3d 纹理)。 我不知道 Three 是否已经在慢慢准备转向 WebGL 2.0,但我对我的 Three84.js 副本进行了一些强制性更改并启用了 WebGL 2.0,并在着色器中进行了一些操作以确保它工作,它做到了!
https://developers.google.com/web/updates/2017/01/nic56
https://developer.mozilla.org/en-US/Firefox/Releases/51

只是想让你知道。 +1 为掩蔽的想法:-)

@erichlof ! 这对 WebGL2 来说是个好消息; 这意味着 WebGL2 渲染器可能能够以更有效的方式解决屏蔽问题。

无论如何,鉴于到目前为止支持 WebGL2 的浏览器的使用非常有限,我认为我们不能放弃使其在 WebGL 1 中工作的努力:几乎所有浏览器都可以运行 WebGL 应用程序需要很长时间,所以它可能会在 WebGL 2 真正可以大规模使用之前,还有一段时间...... 😕 但是感谢您的提示!

你好,我们又见面了!

新更新:我已经完成了我认为内存管理所必需的工作,但是在我运行配置文件时,JS 堆垃圾收集似乎与我的软件配置(运行程序、打开的选项卡、扩展)有很大关系。 对此有更多经验的人能否确认与当前版本的 Threejs 相比,我的代码不那么需要内存?

无论如何,我在examples/webgl_lights_selective_lighting.html 中做了一个例子。 问题是,当在场景的蒙皮对象上同时使用两个聚光灯(在同一层上)时,我得到了与阴影贴图相关的视觉伪影。 静态对象的行为符合预期。 我已经运行了测试,它也发生在 dev 分支上,根本没有考虑选择性光照层(实际上,我只是在 dev 分支上的 shadowmap 示例中添加了一个聚光灯)。 有谁知道这是从哪里来的?

这是一个屏幕截图:
shadowmap

应该可以在此处实时查看示例:

https://rawgit.com/tiesselune/three.js/selective-lighting/examples/webgl_lights_selective_lights.html

我收到一个错误:

Uncaught TypeError: Cannot read property 'set' of undefined
    at init (webgl_lights_selective_lights.html:117)
    at webgl_lights_selective_lights.html:67

@looeee :您必须在本地主机上运行npm run build-uglify 。 为了可合并性,我自愿没有在我的提交中包含构建......

还是我应该?

编辑:这是用于测试目的的不同分支上的工作链接: https :

嘿,我的 +999999。 这应该实现(至少用THREE.Layers

$$('.comment-body').reduce((acc, el) => {
  let mat = el.textContent.match(/\+(\d+)/)
  let num = +(mat && mat[1] || 0)
  return acc + num
}, 0)
>> 1219997

🤔

@mrdoob他在此线程中计算了 +Ns

顺便说一句,+14570 用于选择性灯

这对于微调照明在更高抽象中的工作方式非常有用。

例如,在下面的笔中,我想让 DOM 元素的照明以一种方式工作,而 Sphere 则以另一种方式工作,以使照明更加逼真:

https://codepen.io/trusktr/pen/RjzKJx

某些看起来像单点光源的效果可以通过组合两个或多个仅选择性影响某些元素的光源来实现。

例如,在我之前的示例中,我可以增加光强度以在“DOM 元素”上获得漂亮的阴影,但是球体看起来会有点过于闪亮和明亮。 如果我能够为球体设置更暗的灯光,为“DOM 元素”设置更亮的灯光,那么我可以通过这种方式实现更逼真的效果,在观看者看来仍然只有一个灯光。 然后这种事情可以在更高级别的 API 中抽象出来,当幕后实际上有两个 Three.js 灯在起作用时,它看起来好像只有一个灯被操纵。

@WestLangley

作为一种变通方法,您能否通过为每个房间(及其灯光)设置单独的场景来满足大部分要求?

你有这样的例子的链接吗? 它会对结果产生其他意想不到的渲染效果吗?

对结果的其他意外渲染效果?

透明物体的渲染顺序,例如 - 场景 1 中的透明物体将在场景 2 中的不透明物体之前渲染。

你有这样的例子的链接吗?

在这里,我为你做了一个: https :

透明物体的渲染顺序,例如 - 场景 1 中的透明物体将在场景 2 中的不透明物体之前渲染。

这就是我的想法; 它使变通方法仅适用于非常有限的情况。 期待真正的解决方案!

好吧,您可能会争辩说,只有当您可以通过所述透明对象从场景 1 中看到场景 2 的不透明对象时,才会出现问题。 但如果是这样的话,灯光也应该通过,并且没有理由从一开始就将场景分开。 但我同意这种论点并没有真正令人信服。

@makc这是我试图解决的问题的一个例子:

https://discourse.threejs.org/t/how-to-make-shadows-darker-on-transparent-objects/1389

我认为选择性照明真的会对此有所帮助。

@trusktr我认为你可以通过改变 mrdoob 的阴影材料来解决这个问题。 它只显示黑白阴影纹理,您可以根据需要将其修改为透明

PlayCanvas 中的遮罩似乎很容易用于选择性照明: https ://forum.playcanvas.com/t/set-certain-object-to-not-receive-light/785

我们可以合并吗? 我认为阴影问题是由于 Lambert 着色器与代码更改无关。 @tiesselune

@ErikBehar我今天下午实际上正在寻找一些事情要做,我将尝试将代码更新到最新的 Threejs 并提交拉取请求? 我真的很高兴知道我为这么大的项目做出了真正的贡献。 (很高兴确认此错误与我的更改无关)

编辑:刚刚发现这部分代码发生了很大变化。 我想我需要一点时间,因为我之前使用的状态从 WebGLRenderer 转移到了 WebGLLights。

@tiesselune我有点需要把它放到一个项目中,所以我继续把你的代码移植到 v93 看到: https :

如果你们愿意,我可以做 PR 吗? @mrdoob

@ErikBehar好吧,它确实看起来像我的目标,但我没有时间完全做到这一点。 我想我会把过滤/散列函数移出 WebGLRenderer 并将它们添加到 WebGLLights 状态对象中。 我觉得它们现在属于那里,图层系统是状态的一部分,而不是渲染器的一部分。

@ErikBehar公关会很棒!

@tiesselune我会按照你的建议考虑移动它,或者随时在我的叉子上推送 PR 大声笑 = ] 我会尽快发布 PR @mrdoob

这是什么状态? 我已经将来自@ErikBehar的 r94dev 代码合并到 r94 中,然后将 r97 合并到其中,只有几个非常直接的冲突(版本更改,一些用于选择性照明的变量,以及渲染器/WebGLRenderer.js 中的哈希创建;我会很高兴提交 PR。 @tiesselune如果您能给我一些您打算将选择性照明状态置于何处的想法,我很乐意移动它、测试并提交 PR。

编辑:
稍后:我发现现在需要一些工作才能使用新的 lighthash。

@VaelynPhi我认为,无论他们是否愿意接受@ErikBehar的代码,提交 PR 是个好主意,只是为了替换过时的 PR,以防其他人需要它,比如你自己做过

很抱歉把球丢在这家伙身上= / ...

不用担心; 我理解忙。 唉,我什至找不到你工作的分支,@ErikBehar; 我决定通读代码以尝试分解它,以便我可以将状态移动到适当的位置并希望修复任何错误。 即使在 v94 上,我也还没有进入工作端口状态。 也许我可以按照@makc 的建议清理它并放入 PR 中,以便对其进行更新。 给我一点; 我超级忙。 :) 至少也许这将有助于突出将选择性照明引入最新版本所需的更改。

添加了基于以下内容的 PR:
https://github.com/ErikBehar/three.js/commit/ac0499b70b82bc7bb780100a8372fcdf318d1424#diff -5e43a0b5002eb2c419def3baf67d4e67
通过@ErikBehar
任何人都可以提供一些评论和示例吗?

https://github.com/mrdoob/three.js/pull/15223

各位大侠,这个是什么状态? @tiesselune @ErikBehar我可以帮你做点什么吗? 4年后终于实现它会很好😄💯

@flyrell我认为我们可以关闭这个问题,因为它似乎更接近于在 #15223 中完成?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

seep picture seep  ·  3评论

Horray picture Horray  ·  3评论

fuzihaofzh picture fuzihaofzh  ·  3评论

jlaquinte picture jlaquinte  ·  3评论

ghost picture ghost  ·  3评论