【发布时间】:2013-08-25 03:41:14
【问题描述】:
我不知道如何克服三个渲染器的潜在限制,并希望有人可以很好地设计如何最好地克服这个问题。
假设您使用网格对象创建了一个场景,并为其应用了基本材质。因为您已经使用基本材质创建了对象,所以几何体将永远不会为其生成法线,因为基本材质不需要它。 (以及大多数其他属性)。
假设我现在想再次渲染场景(用于后期处理),但这次我在渲染器上使用了覆盖材质。此覆盖材质是着色器材质,它确实需要法线。
渲染场景时,渲染器将应用覆盖材质,但它会抛出无效指针错误,因为新着色器需要普通属性,但网格几何体没有任何属性,因为它是使用基本材质创建的。
那么我如何才能实现第二次渲染过程呢?第一次渲染必须使用基本材质,因为任何更多的东西都是多余的,可能会减慢应用程序的速度。第二遍必须包含法线作为其渲染后期处理效果的重要信息。我不能每次都在材质或几何体上调用 needsUpdate 作为渲染循环的一部分,并且必须在每帧重建它们将非常昂贵。
那么我该如何处理呢?甚至可能吗?显然,一个答案是我必须首先使用 phong 材料才能生成法线。但在只需要基本着色器和材质的复杂场景中,这可能会非常昂贵。
任何帮助将不胜感激。
谢谢
编辑
忘了提到第二次渲染是在插件中完成的。而且它并不总是在场景之前渲染。后期处理效果可以随意添加和删除。
【问题讨论】:
-
你不能只调用一次“computeVertexNormals”和/或“computeFaceNormals”吗?抱歉,我只是猜测。
-
我不这么认为...据我了解,就在对象被渲染到屏幕之前,它调用了 initMeshBuffers 函数。这实质上创建了数组缓冲区,这些缓冲区稍后会在材质和着色器中使用。默认情况下,几何体具有法线。但在 initMeshBuffers 函数内部,__normalArray 变量永远不会被设置。原因是在填充它们之前,它会查看材料。如果材质是基本的,它决定不应该填充 __normalArray 缓冲区——即使几何体有法线。
-
重建数组的唯一方法是在几何体上调用 needsUpdate 并分配新材料。但是你可以想象,如果我在每一帧都调用 needsUpdate 它将杀死应用程序
-
好吧,只称它为“那些”还不够吗? _normalArray 初始化后,你没事吧?你也可以编辑 three.js 来填充 normalArray?
-
我认为不使用基本材质而是创建我自己的使用修改后的基本着色器的着色器材质可能是一个想法。我想这会绕过这个问题。
标签: three.js