overrideMaterial和renderObject()几何体不匹配



我不知道如何克服三个渲染器的潜在限制,希望有人能有一个好的设计来最好地克服这个问题。

假设您创建了一个包含网格对象的场景,并将基本材质应用于这些对象。因为您使用基本材质创建了对象,所以几何体将永远不会为其生成法线,因为基本材质不需要它。(以及大多数其他属性)。

假设我现在想再次渲染场景(用于后期处理),但这次我在渲染器上使用了覆盖材质。此覆盖材质是着色器材质,它确实需要法线。

渲染场景时,渲染器将应用覆盖材质,但它将抛出无效的指针错误,因为新着色器需要法线属性,但网格几何体没有任何属性,因为它是使用基本材质创建的。

那么,我该如何实现第二次渲染过程呢?第一个渲染必须使用基本材质,因为任何其他渲染都是过度渲染,可能会减慢应用程序的速度。第二个过程必须包含法线作为渲染后处理效果的重要信息。我不能每次都对材质或几何体调用needsUpdate作为渲染循环的一部分,并且必须在每帧重建它们将非常昂贵。

那么我该如何处理呢?这可能吗?显然,一个答案是,我必须首先使用phong材质,以便生成法线。但在只需要基本着色器和材质的复杂场景中,这可能会非常昂贵。

如有任何帮助,我们将不胜感激。

感谢


编辑


忘了提第二次渲染是在插件中完成的。而且它并不总是在场景之前渲染。后期处理效果可以随意添加和删除。

不需要经历所有的麻烦。事实上,initMeshBuffers考虑了法线的存在或缺乏,但它们可以在事后成功计算。我在这里用一个应用程序做了一个基本测试,在将MeshBasicMaterial应用到我的模型后,我简单地称之为

geometry.computeTangents();

然后构建了一个新的ShaderMaterial,并将其用作我的新材料。工作起来很有魅力,希望能有所帮助。

编辑:我应该提到的是,这可能与前面提到的computeVertexNormals()computeFaceNormals()结合在一起,哦,而且着色器材质使用法线作为法线贴图。

我找到了一个解决方案。它可能不是最优雅的,但它很管用。我在渲染调用之前添加了以下代码。不幸的是,函数initWebGLObjects是在插件之前调用的,因此错过了对几何体的任何更新。这意味着当对象材料是基本的时,我必须在插件中再次手动调用initWebGLObjects。理想情况下,我想调用render.updateObject,但该函数是私有的。。。。

//If its a basic material on a mesh, we need to make sure the object is re-built with normals
//This is to make sure when any of the post processes are rendered they have all the vertex 
//attributes they need.
var obj = webglObject.object;
if ( objectMaterial instanceof THREE.MeshBasicMaterial && obj.geometry.__builtNormals === undefined )
{
    var geometry = obj.geometry;
    geometry.__builtNormals = true;                 
    geometry.buffersNeedUpdate = true;
    geometry.uvsNeedUpdate = true;
    geometry.normalsNeedUpdate = true;
    //material.needsUpdate = true;                  
    obj.material = material;
    _renderer.initWebGLObjects( scene );
    obj.material = objectMaterial;
}

相关内容

  • 没有找到相关文章

最新更新